👆这篇写的非常好,墙裂推荐看!本文中的图也是参考了这篇文章,加入了自己的理解,大佬的文章比较长,没有耐心的可以直接看我画的一整张图。
写了一个简单的demo 🚀传送门
基础概念
Image 镜像
Docker 采用分层设计,Image 是一堆只读层(Read-Only)的联合(Unioned),可以把 Image 理解为是一个统一文件系统
Container 容器
Container 和 Image 非常类似,区别在于它最上面的一层是可读写的(Read-Write)
Container = Image + Read-Write Layer
Running Container 运行态容器
一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程
Running Container = Container + Process + Process Space
一个容器中的进程可能对文件系统进行修改、删除、创建,这些改变都作用于可读写层
三者的基本关系:
命令行操作 - image 镜像
- docker create 为镜像添加一个可读写层,构成一个容器
- docker start 为容器文件系统创建一个隔离进程空间,每一个容器只能有一个进程隔离空间
- docker run 快捷命令,先创建一个容器,再运行该容器文件系统
- docker ps 列出正在运行的container
- docker ps -a 列出所有的container,包括运行和停止的
- docker images 列出所有顶层image(top-level)
- docker images -a 列出所有image
- docker stop 停止运行中的container
- docker rm 移除非运行态container
- docker commit 把容器的读写层变为只读层,这样就变成了一个 image
- docker build 根据 Dockerfile 构建一个 image
- docker exec 在运行中容器中执行一个新进程
- docker inspect or 提取image或container最顶层的元数据
- docker save 会创建一个镜像的压缩文件,这个文件能够在另外一个主机的Docker上使用。和export命令不同,这个命令为每一个层都保存了它们的元数据。这个命令只能对镜像生效。
- docker export 创建一个tar文件,并且移除了元数据和不必要的层,将多个层整合成了一个层,只保存了当前统一视角看到的内容(译者注:expoxt后的容器再import到Docker中,通过docker images –tree命令只能看到一个镜像;而save后的镜像则不同,它能够看到这个镜像的历史镜像)
- docker history 递归地输出指定镜像的历史镜像
nginx
静态资源路径:/usr/share/nginx/html
nginx路径:/etc/nginx
# 创建并启动容器,端口映射 本机8080 -> 虚拟机80端口
$ docker container run \
-d \
-p 127.0.0.1:8080:80 \
--rm \
--name mynginx \
--volume "$PWD/html":/usr/share/nginx/html \
nginx
# 复制配置文件到本地
$ docker container cp mynginx:/etc/nginx .
# 重命名nginx文件
$ mv nginx conf
# 停止容器
$ docker container stop mynginx
# 创建、启动容器 添加映射
$ docker container run \
-d \
-p 127.0.0.1:4040:80 \
--rm \
--name mynginx \
--volume "$PWD/html":/usr/share/nginx/html \
--volume "$PWD/conf":/etc/nginx \
nginx
\
.Dockerfile
使用docker file 构建镜像
指令
- FROM
- RUN 每RUN一次,都会新加一层(Layer)
- COPY
- ADD 和COPY类似,但是它可以自动解压
- CMD 在被隔离的 process space 里运行命令
- ENTRYPOINT 和CMD类似,一般用来指定参数
- ENV 指定环境变量
- VOLUME 定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷
- EXPOSE 声明端口
- WORKDIR 指定工作目录,使用RUN创建新的层时,只有WORKDIR的目录会一直存在
开始构建镜像
最后一个.
表示上下文, 如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置
注意: 上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢,可以使用 .dockerignore
指定需要忽略的文件。
docker build -t imagename .
Docker-compose
常用参数
-f 指定Config配置文件
-f
指定配置文件,支持多个配置文件,后面的配置文件路径以第一个配置文件的位置为基础- 后面配置文件会被merge到前面的配置文件中,对同一个
service
相同属性会覆盖,不同属性会被添加
$ docker-compose -f docker-compose.yml -f docker-compose.admin.yml run backup_db
-p 指定Project名称
$ docker compose -p my_project ps -a
NAME SERVICE STATUS PORTS
my_project_demo_1 demo running
$ docker compose -p my_project logs
demo_1 | PING localhost (127.0.0.1): 56 data bytes
demo_1 | 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.095 ms
-d 后台运行 detach
docker compose up
创建并且启动container
$ docker-compose up [SERVICE...]
Networking
bridge network
...未完待续