docker笔记
认识Docker
对于常用的CentOS系统,Docker只支持CentOS7以上版本,不支持CentOS6。
CentOS7系统安装Docker的命令:
# 卸载旧版本docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖工具、配置yum源
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 选择合适的版本安装
yum list docker-ce --showduplicates | sort -r
VERSION_STRING=3:25.0.0-1.el8
sudo yum install docker-ce-$VERSION_STRING docker-ce-cli-$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
# 启动docker
sudo systemctl enable docker
sudo systemctl start docker
Docker服务安装完毕后,还需要做的一件事情是配置镜像加速;因为docker的官方镜像仓库是在国外,除非kexue上网,否则访问镜像仓库速度会非常慢。下面是配置阿里云镜像加速的方法:
登录阿里云官网,搜索容器镜像服务-镜像工具-镜像加速器;根据操作系统不同进行不同的配置,这里以CentOS为例:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://kv7fep4d.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker命令
帮助文档
使用 docker --help 命令可以查看命令的帮助文档;例如,docker pull --help可以查看pull命令的帮助文档
镜像
搜索镜像
搜索镜像有两种方法;第一种是去dockerhub搜索(推荐使用,可视化)、另一种是使用 docker search mysql 命令
下载镜像
使用 docker pull [镜像仓库地址/]镜像名:镜像版本
# 下载最新版本的镜像
docker pull mysql:latest
# 下载指定版本的镜像
docker pull mysql:5.7
列出镜像信息
使用 docker images [选项] 列出镜像信息
# 列出镜像id
docker images -q
# 列出所有镜像id(包括隐藏的)
docker images -a
# 根据镜像name和tag过滤
docker images -a java:8
# 列出完整的镜像id
docker images --no-trunc
# 列出没有tag的镜像
docker images --filter "dangling=true"
docker images 命令可以配合 docker rmi 实现特殊的删除效果,例如:
docker rmi $(docker images --filter "dangling=true" -q)
docker images --format 可以使输出的内容格式化展示:
| Placeholder | Description |
|---|---|
.ID |
Image ID |
.Repository |
Image repository |
.Tag |
Image tag |
.Digest |
Image digest |
.CreatedSince |
Elapsed time since the image was created |
.CreatedAt |
Time when the image was created |
.Size |
Image disk size |
docker images --format "{{.ID}}:{{.Repository}}"
# 表格形式展示
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
# Json格式展示
docker images --format json
导入导出镜像
通过 docker save/load 指令可以将镜像导入或导出:
- docker image save IMAGE -o image.tar.gz: 将docker镜像保存为压缩包
- docker image load < archive file: 将压缩包导入为一个镜像
docker image save helloworld:v1 -o hellov1.tar.gz
docker image load < hellov1.tar.gz
容器
列出容器信息
| Filter | Description |
|---|---|
id |
Container's ID |
name |
Container's name |
label |
An arbitrary string representing either a key or a key-value pair. Expressed as <key> or <key>=<value> |
exited |
An integer representing the container's exit code. Only useful with --all. |
status |
One of created, restarting, running, removing, paused, exited, or dead |
ancestor |
Filters containers which share a given image as an ancestor. Expressed as <image-name>[:<tag>], <image id>, or <image@digest> |
before or since |
Filters containers created before or after a given container ID or name |
volume |
Filters running containers which have mounted a given volume or bind mount. |
network |
Filters running containers connected to a given network. |
publish or expose |
Filters containers which publish or expose a given port. Expressed as <port>[/<proto>] or <startport-endport>/[<proto>] |
health |
Filters containers based on their healthcheck status. One of starting, healthy, unhealthy or none. |
isolation |
Windows daemon only. One of default, process, or hyperv. |
is-task |
Filters containers that are a "task" for a service. Boolean option (true or false) |
使用 docker ps 列出的是运行中的容器信息
# 列出容器信息(不论是否运行)
docker ps -a
# 列出退出状态的容器信息id
docker ps --filter "status=exited" -aq
容器创建运行(重点)
容器继续运行的条件:有一个前台进程在运行着
使用 docker run [options] [image] [command] [args] 来运行一个容器
容器运行方式有三种:
- 后台运行
- 交互式运行
- 默认运行方式
# 默认运行
docker run nginx:latest
# 后台运行
docker run -d nginx:latest
# 交互运行
docker run -it nginx:latest
删除容器
使用 docker rm 命令可以删除容器,前提容器没有在运行中;若要删除一个运行中的容器,需要使用 docker rm -f命令
# 删除容器
docker rm -f $(docker ps --filter name=nginx -q)
进入容器执行命令
使用 docker exec [options] container-id/name commands [arg...] 进入容器内部执行命令
docker exec -it nginx bash
查看容器日志
使用 docker logs [option] 容器id或容器名称 查看容器日志
# 持续输出日志
docker logs -f nginx
# 显示最新10条日志
docker logs —n 10 nginx
容器文件拷贝
使用 docker cp 命令来实现容器与宿主机之间文件和目录的相互拷贝
宿主机文件拷贝到容器:
docker cp /tmp/a.txt nginx:/tmp
容器文件拷贝到宿主机:
docker cp nginx/tmp/a.txt /tmp
停止容器
使用 docker stop 命令可以停止运行中的容器(一个或多个)
docker stop nginx
启动\暂停容器
使用 docker start 命令可以启动停止的容器
docker start nginx
使用 **docker pause/unpause **命令暂停、恢复暂停的容器
docker pasue 392f303a4f0d
docker unpause 392f303a4f0d
列出容器使用情况
使用 docker stats 可以列出实时的容器资源使用情况,使用 --format 可以指定格式输出
docker stats --format "table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"
run命令详解(重点)
实际生产环境中docker run命令要比上面记录的要复杂的多,同时,docker run的参数和选项也会影响着启动的容器
发布端口
要让外部能够访问到容器内的端口,就需要使用 -p 选项指定端口映射,将容器端口发布到宿主机端口
用法:doker run -p 宿主机端口:容器端口 -p 宿主机端口2:容器端口2 容器镜像
如果不了解容器需要映射哪些端口,可以通过dockerhub或者dockerfile中的EXPORE获取
docker run -d -p 80:80 nginx:latest
数据卷
将宿主机目录或者文件挂载到容器中,实现宿主机和容器之间的数据共享和持久化。可以通过dockerfile的VOLUME变量查看
用法:docker run -v 宿主机目录:容器目录:rw 镜像名
默认映射权限是rw,也就意味着对宿主机文件的修改会同步到容器内
docker run -d --name=nginx -p 80:80 -v /tmp/index1.html:/usr/share/nginx/html/index.html nginx:latest
列出所有数据卷
用法:docker volumn ls
删除指定数据卷
用法:docker volumn rm 数据卷id
查看数据卷详情
用法:docker volume inspect 数据卷id
环境变量
容器内某些变量不能写死,需要让使用者在创建容器时指定,这种情况镜像中一般是定义环境变量实现的,如MySQL的root用户密码
用法:docker run -e 变量名=变量值 镜像名
docker run -d -p 13306:3306 -v /mnt/data/mysql:/var/lib/mysql:rw -e MYSQL_ROOT_PASSWORD=whx19981027 mysql:5.7
容器命名
为了方便识别各个容器,可以使用 --name 选项自定义容器名
重启策略
如果不设置容器重启策略,当容器挂掉时,默认不会自动重启;就生产环境而言,容器不自动启动意味着服务停止,严重影响业务;所以,设置容器的重启策略至关重要
重启策略有以下几种:
- no:容器退出时不会自动重启(默认策略)
- always:容器总是在退出后重启
- on-failure[:max-retries]:容器仅在非正常退出时重启,可以指定最大重试次数
- unless-stopped:容器会在退出后自动重启,除非手动停止了容器
用法:docker run --restart always 镜像名
docker run -d --name nginx_demo --restart always -p 10080:80 nginx:latest
其他容器和镜像命令
查看镜像详细信息
用法:docker image inspect [options] 镜像名
查看容器内进程
用法:docker top 容器ID/容器Name
查看容器详细信息
用法:docker inspect [options] 容器ID/容器Name
网络
使用docker network命令可以配置容纳容器网络相关
创建网络
用法:docker network create [网络名称]
查看网络
列出所有的网络使用:docker network ls
查询指定的网络详情:docker network inspect [网络名称]
删除网络
用法:docker network rm [网络名称]
容器加入网络
- 已运行的容器加入网络:
- docker network disconnect [旧网络] [容器id]
- docker network connect [新网络] [容器id]
- 容器初次运行加入网络:docker run --network [网络名称]
Dockerfile
docker file的存在主要是为了自定义镜像;使用docker build命令可以编译自定义dockerfile的镜像。如:
docker build -t //镜像名// -f //dockerfile存在的路径//
指令
LABEL
为镜像添加元数据描述,Label是key=value的形式;可以一次性描述多个元数据,比如:LABEL auther=dalianxia version=1.0
FROM
表示构建自定义镜像用到的基础镜像;用法:FROM 镜像名:镜像版本
CMD
用于容器运行时的默认命令,可以在docker run的时候覆盖掉;多个CMD只有最后一个生效。
用法:
CMD ["命令", "参数..."] 或者 CMD 命令(可以解析环境变量)
ENV
设置环境变量;用法: ENV Content=Java
FROM Centos:7
ENV Content=Java
CMD ["sh", "-c", "echo $Content"]
WORKDIR
设置当前工作目录;如果目录不存在,则自动创建;WORKDIR后支持变量,支持层次递进
RUN
构建过程中执行命令;与CMD指令不同,RUN指令作用域是在镜像构建过程中。
如果RUN后要接多条命令,需要使用 && 连接起来,如:RUN npm install --production --silent && mv node_modules ../
当RUN指令后跟多条语句并且语句冗长时,推荐使用 \ 反斜杠来增加docker file的阅读性
ADD
作用:把构建中的文件、目录或者网络文件复制到镜像当中的指定目录下
注意:
- 如果文件是一个压缩文件,ADD指令会自动将其解压;如果文件是一个网络文件中的压缩包,则不会解压
- ADD指令后所跟的文件要同dockerfile放置在同一目录下,ADD后用./install/xxx.tgz的命令格式
- ADD指令同样支持正则表达式
FROM nginx:1.25
WORKDIR /tmp
ADD ./content.tgz .
RUN cat ./contents.txt
CMD ["nginx", "-g", "daemon off;"]
COPY
作用同ADD基本一致;区别在于COPY不会对压缩文件做解压操作
几个重要参数: --from、--chown、--chmod、--parent
COPY [--from=<image|stage|context>] <src> ... <dest> # --from允许从其他镜像、上下文等复制文件
COPY [--chown=<user>:<group>] [--chmod=<perms> ...] <src> ... <dest> # 复制的同时改变文件或目录属主、权限
COPY [--parents[=<boolean>]] <src> ... <dest> # --parent允许复制父级目录
EXPOSE
作用:暴露需要发布的端口,让镜像使用者知晓哪些端口需要发布;如果不指定协议类型,默认为TCP。
EXPOSE 80/tcp
ENTRYPOINT
作用:指定镜像的默认入口命令;与CMD相似,但是ENTRYPOINT命令无法覆盖
- 运行容器追加命令
- 容器主进程启动前做的准备工作:比如数据库启动前的初始化工作,Redis启动前的用户身份切换等
ENTRYPOINT ["ls", "-a"]
或
ENTRYPOINT ["redis-user-check.sh"]
Docker Compose
docker compose是一个用于定义和运行多个容器的工具;一个使用docker容器的应用,通常由多个容器组成。compose使用一个配置文件来管理多个容器,容器通过services来定义,使用docker compose脚本来启动、停止和重启应用和应用中的服务以及所有依赖服务的容器,适合多个容器进行开发的场景。
新版本的docker已经集成了docker compose,无需单独下载。
命令说明
build
用法:docker compose build [options] [SERVICE...];用于构建或重新构建项目中的服务容器
选项包括:
- --force-rm 删除构建过程中的临时容器
- --no-cache 构建镜像过程不使用cache
- --pull 始终尝试通过pull来获取更新版本的镜像
config
用于验证compose 文件格式是否正确;若是正确则显示配置,否则显示错误原因
down
停止 up 命令启动的容器,并移除网络
exec
进入指定的容器
images
列出compose文件包含的所有镜像
kill
通过发送 SIGKILL 信号来强制停止服务容器;格式为: docker compose kill [options] [SERVICE...]
支持通过 -s 参数来指定发送的停止信号
logs
用法:docker compose logs [options] [SERVICE...];查看服务容器的输出
pause\unpause
暂停一个服务容器\恢复暂停状态中的容器
port
作用:列出某个容器端口所映射的公共端口
用法:docker compose port [options] SERVICE PRIVATE_PORT
选项:
- --protocol=tcp 指定端口协议
- --index=1 如果一个服务存在多个容器,则指定容器序号
ps
作用:列出项目中目前所有容器
用法:docker compose ps [options] [SERVICE]
使用 -q 则只打印容器的ID信息
pull\push
拉取服务依赖的镜像\推送服务依赖的镜像到镜像仓库
rm
删除所有(停止状态下)的服务容器,需要先使用 docker compose stop 来停止容器
选项:
- -f 强制直接删除,包括非停止状态的容器
- -v 删除容器所挂载的数据卷
restart
作用:重启项目中的服务;通过 -t timeout 参数指定重启前停止容器的超时时间(默认10s)
run
用法:docker compose run [options] [-p PORT] [-e KEY=VAL] SERVICE [COMMAND] [ARGS...]
默认情况下,如果存在关联,则所有关联的服务都会自动被启动;
start\stop
作用:启动已经存在的服务容器\停止正在运行的服务容器,但不删除
top
作用:查看服务容器内运行的进程,同Linux上的top命令相似
up
用法:docker compose up [options] [SERVICE...]
该命令尝试自动完成包括构建镜像,重新构建镜像,启动服务,并关联服务相关容器的一系列操作
模板文件
docker compose通过模板文件来管理运行容易,格式为yaml
version: "3.8"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:9.4
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
deploy:
placement:
constraints:
- "node.role==manager"
vote:
image: dockersamples/examplevotingapp_vote:before
ports:
- "5000:80"
networks:
- frontend
depends_on:
- redis
deploy:
replicas: 2
update_config:
parallelism: 2
restart_policy:
condition: on-failure
result:
image: dockersamples/examplevotingapp_result:before
ports:
- "5001:80"
networks:
- backend
depends_on:
- db
deploy:
replicas: 1
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
worker:
image: dockersamples/examplevotingapp_worker
networks:
- frontend
- backend
deploy:
mode: replicated
replicas: 1
labels: [APP=VOTING]
restart_policy:
condition: on-failure
delay: 10s
max_attempts: 3
window: 120s
placement:
constraints:
- "node.role==manager"
visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
stop_grace_period: 1m30s
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints:
- "node.role==manager"
networks:
frontend:
backend:
volumes:
db-data:
Docker Swarm
Docker Swarm是Docker的集群管理工具,作用是把Docker主机抽象成一个整体,通过一个入口管理Docker主机上的Docker资源。Swarm由管理节点和工作节点组成
常用命令
docker swarm init
作用:初始化一个swarm集群;后面常跟参数 --advertise-addr 指定管理节点ip
[root@hcss-ecs-1b32 etc]# docker swarm init --advertise-addr 192.168.99.199
Swarm initialized: current node (sy80xt3pc7v7rwdxx23hv467n) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-444rkbey52jy1yeayhf49dfod9g708bqc0j80bmc7v0rjo4qqs-09ke5dj8nfkx1vuduydpd61qt 192.168.99.199:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
docker swarm join-tocken manager
作用:查看manager节点的 ”入群认证“
docker swarm join-tocken worker
作用:查看worker节点的 ”入群认证“;和docker swarm init 提示的命令一致
docker swarm join --token ...
作用:加入swarm集群,默认是以worker身份(docker swarm join-tocken worker的结果);如果要以manager节点身份加入swarm集群,需要先通过 docker swarm join-tocken manager 查看”入群认证“。
docker node ls
查看集群中的节点;docker swarm集群模式下,对于节点的操作通过docker node来控制,对于网络操作通过docker network来控制,对于运行的服务通过docker service来控制
docker node inspect xxx
查看集群中指定节点的信息
docker node inspect sy80xt3pc7v7rwdxx23hv467n
docker node update
更新节点信息,主要用于对node节点添加\删除标签、角色转变(manager->worker 或者 worker->manager)、节点可用性配置
docker node update --role worker sy80xt3pc7v7rwdxx23hv467n # 将管理节点变为工作节点
docker node update --role manager sy80xt3pc7v7rwdxx23hv467n # 将工作节点变为管理节点
docker node update --availability pause sy80xt3pc7v7rwdxx23hv467n # 标明该节点不可分配新任务
docker node update --availability active sy80xt3pc7v7rwdxx23hv467n # 标明该节点可分配新任务
docker node update --availability drain sy80xt3pc7v7rwdxx23hv467n # 标明该节点不可分配新任务,该节点上运行的服务都会被关闭并在其他节点被安排
docker swarm leave -f
将节点移除集群,如果是manager节点,需要加-f选项强制执行
docker swarm leave -f sy80xt3pc7v7rwdxx23hv467n
docker network inspect $(docker network ls | grep swarm | cut -d ' ' -f 1)
组合命令。查看docker swarm集群的网络信息;展示结果为json字符串

浙公网安备 33010602011771号