Docker 入门
Docker 是一个开源的应用容器引擎,可以让开发者打包应用及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。容器使用沙箱机制,每个容器内运行着一个应用,不同的容器相互隔离,容器之间可以通过网络互相通信。
不同于传统虚拟化方式,传统虚拟机技术是将计算机物理资源进行抽象虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
安装 Docker 和 Docker Compose
☕️ 使用脚本自动安装:
# 下载并运行阿里云的 docker 安装脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 查看 docker 版本
docker -v
# 设置 docker 开机自启动
systemctl enable docker
# 启动 docker
systemctl start docker
# 测试 docker 是否安装正确
docker run hello-world
# 查看 docker 容器,里面会有一个 Exited 状态的 hello-world 容器
docker ps -a
⭐️ 配置 docker 镜像加速器
# 阿里云镜像加速器地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["你的镜像加速器地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
✏️ 将普通用户加入 docker 组
默认情况下,只有 root 用户和 docker 组的用户才能访问 Docker,所以如果想让普通用户执行 docker 命令,通过以下方式设置:
# 建立 docker 组
sudo groupadd docker
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 需要重新登录系统才能生效
📚 安装Docker-Compose
Docker-Compose
是用于定义和运行一组相关联容器的管理工具,可通过编写 YAML 文件来配置所有服务。
# 下载并运行 docker-compose 安装脚本
# docker 和 docker-compose 版本对应关系查看 https://docs.docker.com/compose/compose-file/compose-versioning/
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 将可执行权限应用于二进制文件
chmod +x /usr/local/bin/docker-compose
# 查看 docker-compose 版本
docker-compose -v
常用镜像命令
docker images(查看镜像)
☕️ 命令:docker images [OPTIONS] [REPOSITORY[:TAG]]
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-a |
列出所有镜像(默认隐藏中间镜像) |
-q |
只显示镜像的 ID |
✏️ 例子:
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 7614ae9453d1 4 months ago 113MB
ubuntu 18.04 5a214d77f5d7 6 months ago 63.1MB
redis 3.2 87856cc39862 3 years ago 76MB
REPOSITORY
:镜像的仓库源(名字)TAG
:镜像的标签(版本)IMAGE ID
:镜像的 idCREATED
:镜像的创建时间SIZE
:镜像的大小
镜像的标识有两种方式,一种是镜像 ID,另一种是使用REPOSITORY
和TAG
组合后的镜像名,例如redis:3.2
。
docker pull(下载镜像)
☕️ 命令:docker pull [OPTIONS] NAME[:TAG|@DIGEST]
,如果不写tag
(版本),默认就是latest
⭐️ 例子:
# 拉取最新版本,下面的命令相当于: docker pull mysql:latest
docker pull mysql
# 拉取指定版本,需要确定在仓库中存在该版本
docker pull mysql:5.7
docker rmi(删除镜像)
☕️ 命令:docker rmi [OPTIONS] IMAGE [IMAGE...]
,可以通过镜像的 id/name 删除一个或多个镜像
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-f |
强制删除镜像 |
✏️ 例子:
# 删除指定镜像
docker rmi -f e73346bdf465
# 删除所有的镜像
docker rmi -f $(docker images -aq)
常用容器命令
docker run(新建容器并启动)
☕️ 命令:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
⭐️ 常用可选项:
名称 | 描述 |
---|---|
--name |
为容器指定名称,该名称是唯一的,使用方式为:--name="容器名" |
-d |
后台运行容器,并返回容器 ID |
-i |
以交互模式运行容器,通常与-t 同时使用 |
-t |
为容器重新分配一个伪输入终端,通常与-i 同时使用 |
-P |
随机端口映射,容器内部端口随机映射到主机的端口 |
-p |
指定端口映射,使用方式为:-p 主机端口:容器端口 |
-e |
设置环境变量,使用方式为-e 变量名=value |
-m |
设置容器使用内存最大值 |
--rm |
设置退出时自动删除容器 |
-v |
绑定挂载目录,使用方式为:-v 主机目录:容器目录 或者-v 容器目录 |
--restart=always |
设置容器自启动,docker 服务重启后容器也跟着重启 |
✏️ 以交互方式运行容器:
# 使用交互方式运行容器,可以进入容器内部查看
[root@localhost ~]# docker run -it ubuntu:18.04 /bin/bash
root@8003fd3b5787:/# exit
exit
[root@localhost ~]#
📚 设置容器自启动:
# 设置为每次 docker 服务重启后,容器也会自动重启
docker run --restart=always 镜像id/name
# 如果容器已经启动,可以使用下面命令设置重启方式
docker update --restart=always 容器id
✌ 以后台运行方式启动容器:
# 当以后台运行的方式(-d)启动一个容器,必须要有一个前台进行,否则容器的状态为 Exited
[root@localhost ~]# docker run --name="ubuntu" -d ubuntu:18.04
c4f66aa9667a02a438d0c7be66812b43795cc5a5bd6e851032870a1acf843782
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c4f66aa9667a ubuntu:18.04 "bash" 13 seconds ago Exited (0) 13 seconds ago ubuntu
# 一个解决方式是添加 -it 启动一个前台进程
docker run -dit ubuntu:18.04 /bin/bash
docker ps(列出容器)
☕️ 命令:docker ps [OPTIONS]
,不加任何参数默认显示为正在运行的容器
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-a |
显示所有容器,包括未运行的 |
-l |
显示最近创建的容器 |
-n |
列出最近创建的 n 个容器 |
-q |
只显示容器 ID |
✏️ 例子:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfa4c754b24e ubuntu:18.04 "/bin/bash" 2 seconds ago Up 1 second focused_buck
CONTAINER ID
:容器idIMAGE
:镜像COMMAND
:引用命令CREATED
:创建容器的时间STATUS
:容器状态PORTS
:暴露的端口NAMES
:容器名称
docker rm(删除容器)
☕️ 命令:docker rm [OPTIONS] CONTAINER [CONTAINER...]
,命令中的CONTAINER
为容器的 id/name
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-f |
强制删除正在运行的容器 |
-v |
删除与容器关联的卷 |
✏️ 例子:
# 删除指定容器
docker rm -f e73346bdf465
# 删除所有的容器
docker rm -f $(docker ps -aq)
docker start/restart(启动和重启容器)
# 启动容器
docker start 容器id/name
# 重启容器
docker restart 容器id/name
docker stop/kill(停止和杀死容器)
# 停止当前运行的容器
docker stop 容器id/name
# 强制停止运行的容器
docker kill 容器id/name
docker exec(在运行的容器中执行命令)
☕️ 命令:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
⭐️ 常用可选项:
名称 | 默认 |
---|---|
-d |
分离模式,在后台运行 |
-i |
即使没有附加也保持 STDIN 打开 |
-t |
分配一个伪终端 |
✏️ 例子:
# 在指定容器中开启一个交互模式的终端
docker exec -it 容器id/name /bin/bash
docker logs(日志信息)
☕️ 命令:docker logs [OPTIONS] CONTAINER
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-f |
跟踪日志输出 |
-t |
显示时间戳 |
--tail |
仅列出最新 N 条容器日志 |
✏️ 例子
# 显示全部日志
docker logs -ft 容器id/name
# 显示最新 10 条日志
docker logs -ft --tail 10 容器id/name
docker inspect(返回容器详细信息)
☕️ 命令:docker inspect [OPTIONS] NAME|ID [NAME|ID...]
⭐️ 常用可选项:
名称 | 描述 |
---|---|
-f |
指定返回值的模板文件 |
-s |
显示总的文件大小 |
--type |
为指定类型返回JSON |
✏️ 例子
docker inspect 容器id/name
Docker 实例
安装 MySQL
# 拉取 MySQL 镜像
docker pull mysql:5.7
# 创建并运行 MySQL 容器
docker run -p 3306:3306 --name=mysql -v $PWD/mysql/conf:/etc/mysql/conf.d -v $PWD/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -it -d mysql:5.7
-p: 映射主机到容器的端口
--name: 设置容器名
-v: 挂载主机目录到容器目录
-e: 设置环境变量,此处指定 root 用户密码
-it: 以交互模式运行容器
-d: 使用后台方式运行容器
# 设置容器自启动
docker update --restart=always mysql
安装 Redis
# 拉取 Redis 镜像
docker pull redis:latest
# 创建并运行 Redis 容器
docker run -p 6379:6379 --name redis -it -d redis:latest
# 设置容器自启动
docker update --restart=always redis