Docker学习
Docker
什么是Doker
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker安装
设置仓库
-
更新 apt 包索引并安装软件包
1
2
3
4
5
6sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release -
添加 Docker 的官方 GPG 密钥:
1
2sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -
使用以下命令设置存储库:
1
2
3echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
安装 Docker 引擎
-
更新包索引,并安装最新版本的 Docker 引擎、容器和 Docker Compose,或转到下一步以安装特定版本:
1
2sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -
要安装特定版本的 Docker 引擎,需要在存储库中列出可用版本,然后选择并安装:
一个。列出存储库中可用的版本:
1 | apt-cache madison docker-ce |
b.使用第二列中的版本字符串安装特定版本,例如 。5:20.10.16~3-0~ubuntu-jammy
1 | sudo apt-get install docker-ce=<版本号> docker-ce-cli=<版本号> containerd.io docker-compose-plugin |
- 运行
Docker
1 | sudo service docker start |
- 通过运行映像来验证 Docker 引擎是否已正确安装。
hello-world
1 | sudo docker run hello-world |
输出结果会出现 hello world。
卸载 Docker 引擎
-
卸载 Docker 引擎、CLI、Containerd 和 Docker Compose 包:
1
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
主机上的映像、容器、卷或自定义配置文件不会自动删除。删除所有映像、容器和卷:
1
2sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
必须手动删除任何已编辑的配置文件。
使用镜像加速器
不使用镜像加速器可能会有点慢,我用的是阿里云的镜像加速器。
- 找到容器镜像服务
- 镜像加速器就有我们需要的加速器地址了,直接复制里面操作文档的代码就行了。
上面介绍Docker的安装,下面是Docker的操作。
Docker常用命令
帮助启动类命令
- 启动 docker:
systemctl start docker
- 停止 docker:
systemctl stop docker
- 重启 docker:
systemctl restart docker
- 查看 docker 状态:
systemctl status docker
- 开机启动:
systemctl enable docker
- 查看 docker 概要信息:
docker info
- 查看 docker 总体帮助文档:
docker --help
- 查看 docker 命令帮助文档:
docker xxx某某命令 --help
其实就是 linux 服务的命令。
镜像命令
列出本机上的镜像
1 | docker images |
选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签版本号
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
需注意:同一仓库源可以有多个 TAG 版本,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG
来定义不同的镜像。如果我们不指定一个镜像的版本标签,docker 默认使用最新版本镜像。
搜索镜像
1 | docker search 镜像名 |
下载镜像
1 | docker pull 镜像名[:TAG] |
TAG
就是标签,可以不加,这样默认下载最新版本镜像。TAG
可以指定版本下载镜像。
查看镜像/容器/数据卷所占空间
1 | docker system df |
删除镜像
1 | docker rmi 镜像名/镜像ID |
批量删除:
1 | docker rmi 镜像名1:TAG 镜像名2:TAG |
删除全部:
1 | docker rmi -f $(docker images -qa) |
docker images -qa
获取所有镜像ID。
**虚悬镜像:**仓库名、标签都是<none>
的镜像,称作虚悬镜像 dangling image。
容器命令
有镜像才能创建容器。
新建+启动容器
需要运行镜像才能创建容器
1 | docker run [OPTIONS] IMAGE |
OPTIONS参数说明(常用):
- –name=“容器新名字”:为容器指定一个名称。
- -d:后台运行容器并返回容器ID。
- -i:以交互模式运行容器,通常与
-t
一起使用。interactive。 - -t:为容器重新分配是一个为输入终端,通常与
-i
同时使用。terminal。 - -P:随机端口映射,注意这是大写P。
- -p:指定一个端口映射,注意这是小写P。-p 8080:80,第一个物理机端口,第二个容器端口。
例如:
1 | docker run -it --name=myubuntu01 ubuntu /bin/bash |
此时我们进入到 docker 的 ubuntu 中了。exit
退出。此时输入的命令是在 docker 的 ubuntu 中执行。
查看正在运行的容器
1 | docker ps |
退出容器
1 | exit |
ctrl+p+q (快捷键)run 进去容器,ctrl+p+q 退出,容器不停止。
启动 | 重启 | 停止容器
1 | docker start 容器名或id -------开启容器 |
删除容器
如果容器没有停止,则不能删除,除非使用强制删除。
1 | docker rm 容器名或id |
进入容器
1 | docker exec -it 容器名或id bash |
1 | docker attach 容器名或id |
查看容器内服务日志
1 | docker logs 容器ID |
查看容器内的进程
1 | docker top 容器名或ID |
查看容器内部细节
1 | docker inspect 容器ID |
主机与容器进行文件传输
1 | docker cp 主机文件 容器名(或id):容器路径 -------将主机文件复制到容器内部 |
导出 | 导入容器
1 | docker export 容器ID > 文件名.tar |
1 | cat 文件名.tar | docker import-镜像用户/镜像名:镜像版本号 |
将容器打包成镜像
1 | docker commit -m "描述信息" -a "作者" 容器名或id 镜像名:标签 |
将镜像保存成一个.tar 文件
1 | docker save 镜像名称:标签 -o 文件名 |
前台交互式启动:
1 | docker run -it redis |
Ubuntu这些就需要前台交互式启动。
后台守护式启动:
像 Redis、MySQL这些我们只需要让它们在后台运行就行了。
1 | docker run -d redis |
后台守护启动查看日志:
1 | docker logs 容器ID |
数据卷
数据卷:将docker容器内的数据保存进宿主机的磁盘中,将数据持久化保存, 也实现数据共享。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷中的生命周期一直持续到没有容器使用为止
数据卷命令
创建数据卷
1 | docker volume create 卷名 |
查看所有数据卷
1 | docker volume ls |
查看某个数据卷的细节
1 | docker volume inspect 卷名 |
删除数据卷
1 | docker volume prune ------自动删除所有未使用的数据卷 |
把数据卷挂载到容器中
1 | docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 |
可以使用docker inspect
查看该容器挂载到哪些目录
以上默认该文件可读可写。
我们可能有时候需要设置可读:
1 | docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 |
这里的可读是指:主机可以写入数据到容器,而容器不能写入到主机,容器不能影响主机。通常用于同步数据
卷的继承和共享
1 | docker run -it --privileged=true --volimes-from u1 --name u2 ubuntu |
需注意的是,此时如果 u1 容器停止不会影响到 u2 容器。但是如果 u1 容器再次启动,此时 u2 更改的数据卷会共享给 u1 容器。
常用服务的安装
服务安装总体步骤:
- 搜索镜像
- 拉取镜像
- 查看镜像
- 启动镜像 ===》服务端口映射
- 停止容器
- 移除容器
MySQL
1 | docker pull mysql |
进入容器:
1 | docker exec -it mysql bash |
登录 MySQL:
1 | mysql -u root -p |
MySQL 好像 8 版本之后都会默认允许外网访问。user 表中的 root用户有两个, 一个是支持 localhost 访问,一个是 % 的数据,表示外部所有IP都可访问。
Redis
docker 安装的 redis 默认没有配置文件,需要我们自己准备,我是去下载 redis 官网的压缩包自己复制了一份。
1 | mkdir conf |
1 | docker pull redis |
搭建Redis集群
这个是我搭的例子:
开了六个 Redis 容器:
1 | sudo docker run -d --name redis-node-1 --net host -v $PWD/conf/redis.conf:/etc/redis/redis.conf -v $PWD/data/share/redis-node-1:/redis/data redis --cluster-enabled yes --appendonly yes --port 6381 |
进入其中一个容器输入以下命令:
1 | redis-cli --cluster create 你的真实ip:端口号 你的真实ip:端口号 你的真实ip:端口号 你的真实ip:端口号 你的真实ip:端口号 你的真实ip:端口号 --cluster-replicas 1 |
真实ip 可在虚拟机输入 ifconfig
查看。
进入 redis
1 | redis-cli -p 6385 -c |
查看集群节点信息,从这里可以知道节点的主从关系。
1 | cluster nodes |
Dockerfile
Dockerfile是用来构建 Docker 镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
Dockerfile 执行大致流程
保留字 | 作用 |
---|---|
FROM | 当前镜像是基于哪个镜像 第一个指令必须事 FROM |
MAINTAINER(deprecated) | 镜像维护者的姓名和邮箱地址 |
RUN | 构建镜像时需要运行的指令 |
EXPOSE | 当前容器对外暴露出的端口号 |
WORKDIR | 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点 |
ENV | 用来在构建镜像的过程中设置环境变量 |
ADD | 将主机目录下的文件拷贝进镜像且 ADD 命令会自动处理 URL 和解压 tar 包 |
COPY | 类似于 ADD,拷贝文件和目录到镜像中 将从结构上下文目录中 <原路径> 的文件 / 目录复制到新的一层的镜像的 < 目标路径 > 位置 |
VOLUME | 容器数据卷,用于数据保存和持久化工作 |
CMD | 指定一个容器启动时要运行的命令 Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 命令行参数中指定的程序替换 |
ENTRYPOINT | 指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及其参数 |
FROM
- 当前镜像基于哪个镜像,指定一个已经存在的镜像作为模板
- 第一条必须是 FROM
1 | FROM <image> |
MAINTAINER
- 镜像维护者的姓名和邮箱地址
RUN
- 容器构建时需要运行的命令
- 在 docker build 时运行
1 | # shell 命令 |
EXPOSE
- 用来指定构建的镜像在运行为容器时对外暴露的端口
1 | EXPOSE <port>[/tcp|/udp] |
WORKDIR
- 指定在创建容器后,终端默认登录的工作目录,落脚点
1 | WORKDIR <dir> |
USER
- 指定该镜像以什么样的用户去执行
- 默认 root
ENV
- 用来在构建镜像过程中设置环境变量
- 该环境变量可以在后续的任何 RUN 指令中使用
1 | ENV <key> <value> |
VOLUME
- 容器数据卷,用于数据保存和持久化工作
1 | VOLUME /data |
ADD
- 将宿主机目录下的文件拷贝进镜像且会自动处理 URL 和解压 tar 压缩包
1 | ADD <src> <dir> |
COPY
- 类似 ADD, 拷贝文件和目录到镜像中
- 路径不存在将会自动创建
1 | COPY <src> <dir> |
CMD
- 在 docker run 时运行
- 指定容器启动后需要干的事情
- 语法与 RUN 相似,也是两种格式
- Dockerfile 可以有多条 CMD 指令,但是只有最后一条生效(是最后一条命令覆盖前面的命令)
- CMD 指令会被 docker run 之后的参数替换
1 | # shell |
举个栗子说明覆盖操作:
1 | 这是 tomcat 的 dockerfile 的 CMD指令 |
ENTRYPOINT
- 与 CMD 类似
- 在 docker run 时运行
- 不会被 docker run 的命令行参数指定的指令覆盖,这些命令行参数会被当做参数送给 ENTRYPOINT 指令指定的程序。叠加命令。
- 可以和 CMD 一起用,一般是变参才会使用 CMD ,相当于给 ENTRYPOINT 传参
1 | ENTRYPOINT <命令行命令> |
Docker build 命令
语法
1 | docker build [OPTIONS] PATH | URL | - |
OPTIONS说明:
- –build-arg=[] : 设置镜像创建时的变量;
- –cpu-shares : 设置 cpu 使用权重;
- –cpu-period : 限制 CPU CFS周期;
- –cpu-quota : 限制 CPU CFS配额;
- –cpuset-cpus : 指定使用的CPU id;
- –cpuset-mems : 指定使用的内存 id;
- –disable-content-trust : 忽略校验,默认开启;
- -f : 指定要使用的Dockerfile路径;
- –force-rm : 设置镜像过程中删除中间容器;
- –isolation : 使用容器隔离技术;
- –label=[] : 设置镜像使用的元数据;
- -m : 设置内存最大值;
- –memory-swap : 设置Swap的最大值为内存+swap,"-1"表示不限swap;
- –no-cache : 创建镜像的过程不使用缓存;
- –pull : 尝试去更新镜像的新版本;
- –quiet, -q : 安静模式,成功后只输出镜像 ID;
- –rm : 设置镜像成功后删除中间容器;
- –shm-size : 设置/dev/shm的大小,默认值是64M;
- –ulimit : Ulimit配置。
- –squash : 将 Dockerfile 中所有的操作压缩为一层。
- –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –network: 默认 default。在构建期间设置RUN指令的网络模式
举个栗子
编写Dockerfile
1 | # 基础镜像使用Java |
使用 docker build
创建镜像
1 | # 注意 -t 等价于 --tag,并且可以看见后面有个小数点 |
使用 docker images
查看镜像
运行容器
1 | docker run -d -p 8888:8888 镜像id |
使用docker ps
查看容器是否运行成功。
Compose
Compose安装
1 | sudo apt-get update |
测试是否安装成功
1 | docker compose version |
Compose常用命令
1、docker-compose up
示例:
1 | #启动所有服务 |
2、docker-compose ps
1 | 示例: |
3、docker-compose -h
1 | #查看帮助 |
4、docker-compose down
1 | #停止和删除容器、网络、卷、镜像。 |
5、docker-compose pull
1 | #拉取服务依赖的镜像 |
6、docker-compose start
1 | #启动已经存在的服务容器 |
7、docker-compose restart
1 | #重启项目中的服务 |
选项包括:
–f, –force,强制直接删除,包括非停止状态的容器
-v,删除容器所挂载的数据卷
8、docker-compose stop
选项包括:
-t, –timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)
示例
1 | #停止正在运行的容器,可以通过 docker-compose start 再次启动 |
9、docker-compose scale
1 | #设置指定服务运行的容器个数,通过 service=num 的参数来设置数量 |
10、dokcer-compose config
1 | #验证并查看 compose 文件配置 |
选项包括:
–resolve-image-digests 将镜像标签标记为摘要
-q, –quiet 只验证配置,不输出。 当配置正确时,不输出任何内容,当文件配置错误,
输出错误信息
–services 打印服务名,一行一个
–volumes 打印数据卷名,一行一个
docker-compose.yaml配置解释
1 | version: "3.7" |
Author: xun
Link: http://blog.fooo.in/2022/07/31/ops/Docker/
License:
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。