开源的应用容器引擎
打包环境和应用到一个轻量级,可移植的容器中,发布到任何 Linux 机器上,规避了软件跨环境迁移的问题
沙箱机制,相互隔离
1.1 安装 sudo apt install docker-ce 1.2 架构
守护进程(daemon):后台服务,管理一个 Docker 进程
镜像(image):相当于一个 root 文件系统,打包了环境和应用
容器(container):镜像运行时的实体,可以被创建,启动,暂停, 停止,删除
仓库(repository):保存镜像文件
2. Docker命令 2.1 服务(守护进程)相关启动
sudo systemctl start docker查看
sudo systemctl status docker停止
sudo systemctl stop docker重启
sudo systemctl restart docker 2.2 镜像相关查看
sudo docker images搜索
# 查看具体版本号需要去 hub.docker.com sudo docker search ubuntu拉取
# 配置阿里云加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors sudo vim /etc/docker/daemon.json { "registry-mirrors": ["加速地址"] } sudo systemctl daemon-reload sudo systemctl restart docker # 拉取镜像 sudo docker pull ubuntu[:版本]删除
sudo docker rmi ubuntu[:版本] 2.3 容器相关查看
# 要查看所有包括已停止运行的容器:加上参数 -a sudo docker ps创建
# -i:保持STDIN打开,-t:交互模式,bash:自定义进入容器后执行的命令 # -it 启动的容器称为交互式容器,exit 命令退出后容器会自动停止 sudo docker run -it --name u1 ubuntu[:版本] bash # -d:后台创建容器,不会立即进入 # -id 启动的容器称为守护式容器,exit 退出时容器也不会自动停止 sudo docker run -id --name u1 ubuntu[:版本]进入
# 只能进入正在运行的容器 sudo docker exec -it u1 bash启动
# 这种方式启动容器后 exit 退出时也不会自动停止 sudo docker start u1停止
sudo docker stop u1删除
# 不能删除正在运行的容器 sudo docker rm u1查看信息
sudo docker inspect u1 3. Docker数据卷 3.1 简介宿主机中的一个目录(或文件),与容器内目录(文件)绑定后,同步它们的数据
可以被多个容器同时挂载,一个容器也可以挂载多个数据卷
数据持久化与数据交换
3.2 配置数据卷 # 创建启动容器时,-v 参数设置 # 容器内目录必须是绝对路径,宿主机目录可以相对,但相对的是 /var/lib/docker/volumes/,并不是当前路径 # 目录不存在会自动创建,而文件不存在时会被当成目录创建并挂载 # 可用多个 -v 挂载多个 sudo docker run ... -v 宿主目录(文件):容器内目录(文件) ... --name u1 ubuntu[:版本] 3.3 配置数据卷容器配置一个专门的容器来挂载数据卷,其他容器挂载这个容器(这时候相当于挂载同一个数据卷)来交换数据
sudo docker run ... -v 宿主目录(文件):容器内目录(文件) ... --name u1 ubuntu[:版本] # 其他容器挂载 u1 sudo docker run ... --volumes-from u1 --name u2 ubuntu[:版本] sudo docker run ... --volumes-from u1 --name u3 ubuntu[:版本] 4. Docker应用部署 4.1 搜索并拉取镜像 sudo docker search mysql sudo docker pull mysql:5.7 4.2 MySQL部署 # 宿主机创建MySQL目录用来存储数据信息 mkdir mysql cd mysql # 端口映射 宿主机:容器 sudo docker run -id \ -p 3306:3306 \ -v $PWD/conf.d:/etc/mysql.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=111 \ --name m1 mysql:5.7 4.3 Nginx部署 mkdir nginx cd nginx # 如果需要默认配置,可先启动一个容器将默认配置复制一份,否则宿主机空文件挂载后会覆盖容器内文件 # sudo docker cp n1:/etc/nginx/nginx.conf nginx.conf sudo docker run -id \ -p 80:80 \ -v $PWD/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/conf.d:/etc/nginx/conf.d \ -v $PWD/logs:/var/log/nginx \ --name n1 nginx 5. Docker镜像制作 5.1 Docker镜像原理Docker镜像是由特殊的 文件系统 叠加 而成
最底端使用宿主机的bootfs
第二层是 rootfs,被称为基础镜像
最顶层为对外镜像名,下层镜像称为上层镜像的父镜像,下载时会把父镜像一并下载
统一文件系统将不同层整合成了一个文件系统,隐藏了多层的存在
镜像是只读的,从一个镜像启动容器时,会在顶层加载一个读写文件系统作为容器
5.2 方式一:容器转镜像这种方式并不常用,因为打包后体积巨大不利于传递。
# 原容器中挂载的目录(文件)不会被提交到镜像 sudo docker commit 容器名(id) 镜像名[:版本号] # 镜像打包 sudo docker save -o 文件名 镜像名[:版本号] # 镜像还原 sudo docker load -i 文件名 5.3 方式二:Dockerfile包含多条指令的文本文件
每条指令构建一层,基于基础镜像
提供完全一致的环境的构建方法
参照 hub.docker.com 上相关镜像的写法