docker 教程
基础
安装
windows
- 下载 docker desktop 即可;
- 要求 21H2 版本之后且打开 Hyper-V;
debian11
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
镜像
基本概念
镜像
- 最小化的 linux 系统;
管理镜像
拉取镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
;
docker pull debian
镜像列表
docker image ls
镜像体积
docker system df
删除镜像
docker image rm [选项] <镜像1> [<镜像2> ...]
;docker image prune
;
# 删除指定镜像
# -f 强制删除
docker image rm -f 501
# 删除所有未使用镜像
docker image prune
导出镜像
- 不推荐使用;
# 导出为 file
docker save alpine -o filename
# 导出并 gzip 压缩
docker save alpine | gzip > alpine-latest.tar.gz
导入镜像
docker load -i alpine-latest.tar.gz
DockerFile
DockerFile
- 名为 DockerFile 的文本文件;
- 包含若干指令;
FROM
- 指定基础镜像;
FROM debian:stretch
RUN
- 执行命令行命令;
- shell 格式:
RUN <命令>
; - exec 格式:
RUN ["可执行文件", "参数1", "参数2"]
;
RUN apt-get update \
&& apt-get install gcc vim \
&& apt-get purge -y --auto-remove
COPY
- 复制文件;
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
;COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
;
COPY package.json /usr/src/app/
COPY hom* /mydir/
COPY hom?.txt /mydir/
CMD
- 容器默认启动命令;
- 默认为
bash
; - shell 格式:
CMD <命令>
;- 使用 shell 格式实际为
CMD [ "sh", "-c", "<命令>" ]
;
- 使用 shell 格式实际为
- exec 格式:
CMD ["可执行文件", "参数1", "参数2"]
;
CMD echo $HOME
CMD ["nginx", "-g", "daemon off;"]
ENV
- 定义环境变量;
ENV VERSION=1.0 DEBUG=on \
NAME="Happy Feet"
EXPOSE
- 告知容器使用什么端口;
- 同时宿主机使用随机端口映射时默认映射的该端口;
EXPOSE 1234
构建镜像
docker build [选项] <上下文路径/URL/->
;
# -t 容器名称
docker build -t nginx .
指令数量
- DockerFile 中一条指令构建一层镜像;
- 指令数量尽可能的少;
容器
基本概念
镜像
- 镜像是系统的定义模板;
- 容器是镜像的实例化;
管理镜像
容器列表
# 所有处于启动状态的容器
docker container ls
docker ps
# 所有容器
docker container ls -a
docker ps -a
启动容器
docker run [选项] [镜像名/id] [命令]
;
# -d 后台运行
# -i 交互式操作
# -t 进入终端
# --rm 容器退出后立刻删除
# -p 映射端口号, 宿主 port:容器 port
# --name 容器名称
docker run -dit --rm -p 1234:8080 --name test debian bash
启动已终止容器
docker container start <id>
终止容器
docker container stop <id>
进入容器
docker exec -it 69d1 bash
导出容器
docker export 7691a814370e > ubuntu.tar
导入容器
cat ubuntu.tar | docker import - test/ubuntu:v1.0
删除容器
# 删除指定容器
docker container rm <id>
# 删除所有处于终止状态的容器
docker container prune
容器元数据
docker inspect web
数据管理
数据卷
数据卷
- 可被多个容器共享使用的文件目录;
- 数据卷默认一直存在;
- 生命周期独立于容器;
创建数据卷
docker volume create vol-name
数据卷列表
docker volume ls
数据卷信息
docker volume inspect vol-name
挂载数据卷
docker run -d -P --name web -v my-vol:/usr/share/nginx/html nginx:alpine
docker run -d -P --name web --mount source=my-vol,target=/usr/share/nginx/html nginx:alpine
删除数据卷
docker volume rm my-vol
docker volume prune
挂载主机目录
挂载主机目录
docker run -d -P --name web -v /src/webapp:/usr/share/nginx/html nginx:alpine
docker run -d -P --name web --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html nginx:alpine
挂载主机文件
docker run -d -P --name web --mount -v $HOME/.bash_history:/root/.bash_history nginx:alpine
docker run -d -P --name web --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history nginx:alpine
网络
外部访问容器
映射接口
# -p 指定映射端口, ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
docker run -d -P nginx:alpine
映射所有接口地址
docker run -d -p 80:80 nginx:alpine
映射指定地址
ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
映射指定地址的任意端口
$ docker run -d -p 127.0.0.1::80 nginx:alpine