docker 从安装到使用的常用命令
2022-03-21 14:33:06 # 常用

tip:

  • 本文将介绍如何在 Debian 11 和 CentOS7 下安装 Docker 以及 Docker Compose。
  • 本文同时适用于 Debian 11、 Debian 10 Buster、Ubuntu 20.04 Focal 以及 Ubuntu 18.04 Bionic*
  • 以下操作需要在 root 用户下完成,请使用 sudo -i 或 su root 切换到 root 用户进行操作。
  • 如果想要查询 Docker 镜像的详细版本请前往 Docker hub 官网:
  • https://hub.docker.com/search?q=
  • 部分资料来源 烧饼博客 感谢 @Showfom 大佬

什么是 Docker?


Docker 是一种容器化技术,可以在服务器上快速搭建容器并在不污染宿主机的情况下运行软件,而不再需要安装配置各种环境。开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。

什么是 Docker Compose?


传统模式下运维人员需要运行 docker run 来启动各种容器,一旦容器过多,就无法一次性记住所有的运行参数和命令,这时候我们可以使用 Docker Compose 来解决这个问题。

Docker Compose 是一种工具,用于帮助定义和共享多容器应用程序。 通过 Compose,你可以创建 YAML 文件来定义服务,并且只需一个命令,就可以启动或清理所有内容。使用 Compose 的巨大优点是,你可以在文件中定义应用程序堆栈,使其位于项目存储库的根目录下(它现在受版本控制),并方便其他人参与你的项目。 其他人只需克隆你的存储库即可开始撰写应用。 事实上,你可能会看到 GitHub/GitLab 上的很多项目现在都是这样做的。(via 使用 Docker Compose)

CentOS7 安装 Docker


清理 CentOS7 自带 Docker 版本

1
2
3
4
5
6
7
8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

CentOS7 安装 Docker 所需依赖

1
yum install -y yum-utils device-mapper-persistent-data lvm2

CentOS7 安装 Docker-ce 源

1
2
yum-config-manager \
--add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

CentOS7 更新缓存 Yum 缓存

1
yum makecache fast

CetnOS7 下载 Docker

1
yum -y install docker-ce

Debian 11 安装

Debian 11 安装 Docker 所需要的依赖

1
2
3
apt update
apt upgrade -y
apt install curl vim wget gnupg dpkg apt-transport-https lsb-release ca-certificates

然后加入 Docker 的 GPG 公钥和 apt 源:

1
2
curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://download.docker.com/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

国内机器可以用清华 TUNA的国内源:

1
2
curl -sS https://download.docker.com/linux/debian/gpg | gpg --dearmor > /usr/share/keyrings/docker-ce.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-ce.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -sc) stable" > /etc/apt/sources.list.d/docker.list

然后更新系统后即可安装 Docker CE:

1
2
apt update
apt-get install docker-ce docker-ce-cli containerd.io

安装 Docker Compose

我们可以使用 Docker 官方发布的 Github 直接安装最新版本:

1
2
curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

此时可以使用 docker-compose version 命令检查是否安装成功:

1
2
root@debian ~ # docker-compose version
Docker Compose version v2.6.1

查看 Docker 版本并启动 Docker 服务

此时可以使用 docker version 命令检查是否安装成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@server nginx]# docker version
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:05:12 2022
OS/Arch: linux/amd64
Context: default
Experimental: true

Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:03:33 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.6
GitCommit: 10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
runc:
Version: 1.1.2
GitCommit: v1.1.2-0-ga916309
docker-init:
Version: 0.19.0
GitCommit: de40ad0

出现上述打印时,代表 Docker 已经安装成功。

现在你可以使用 systemctl start docker 启动 Docker 服务,使用 systemctl status docker查看 Docker 状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@server nginx]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2022-06-20 14:20:41 CST; 2 months 23 days ago
Docs: https://docs.docker.com
Main PID: 2823 (dockerd)
Tasks: 9
Memory: 129.1M
CGroup: /system.slice/docker.service
└─2823 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
Jul 04 16:47:02 server dockerd[2823]: time="2022-07-04T16:47:02.754108737+08:00" level=info msg="ignoring event" container=9e2...Delete"
Jul 04 16:47:15 server dockerd[2823]: time="2022-07-04T16:47:15.664988858+08:00" level=warning msg="Published ports are discar...k mode"
Jul 04 16:47:15 server dockerd[2823]: time="2022-07-04T16:47:15.730605349+08:00" level=warning msg="Published ports are discar...k mode"
Jul 04 16:47:59 server dockerd[2823]: time="2022-07-04T16:47:59.644912415+08:00" level=info msg="ignoring event" container=dd4...Delete"
Jul 05 11:29:47 server dockerd[2823]: time="2022-07-05T11:29:47.355243389+08:00" level=info msg="ignoring event" container=1b3...Delete"
Jul 05 14:57:13 server dockerd[2823]: time="2022-07-05T14:57:13.380661904+08:00" level=info msg="ignoring event" container=246...Delete"
Jul 05 15:22:38 server dockerd[2823]: time="2022-07-05T15:22:38.315766291+08:00" level=info msg="ignoring event" container=246...Delete"
Jul 05 15:27:11 server dockerd[2823]: time="2022-07-05T15:27:11.962833484+08:00" level=info msg="ignoring event" container=530...Delete"
Jul 31 00:09:12 server dockerd[2823]: time="2022-07-31T00:09:12.408910765+08:00" level=info msg="ignoring event" container=530...Delete"
Jul 31 00:09:20 server dockerd[2823]: time="2022-07-31T00:09:20.743421203+08:00" level=info msg="ignoring event" container=422...Delete"
Hint: Some lines were ellipsized, use -l to show in full.

查看 Docker 镜像

1
2
3
docker images
docker images -qa
docker images --digests

设置 Docker 镜像源加速 (中科大镜像源)

1
2
3
4
5
6
7
8
9
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.nju.edu.cn/"
]
}
EOF

重启 Docker 使其配置生效

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

查看 Docker 的 GitHub 列表目录

1
2
3
4
5
6
7
8
9
10
11
docker search [想查看的Docker应用]
例:
[root@server ~]# docker search python
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
python Python is an interpreted, interactive, objec… 7701 [OK]
pypy PyPy is a fast, compliant alternative implem… 330 [OK]
circleci/python Python is an interpreted, interactive, objec… 51
hylang Hy is a Lisp dialect that translates express… 45 [OK]
bitnami/python Bitnami Python Docker Image 22 [OK]
cimg/python 5

Docker 常用命令

查看 Docker 镜像源

1
2
3
docker images
docker images -qa
docker images --digests

拉取 Docker 镜像

1
docker pull <镜像名>

运行 Docker 镜像

1
2
3
4
5
6
7
8
# 启动并进入镜像
# -i,-t 两个参数推荐一起使用
docker run -it [CONTAINER ID]
# 后台运行,不进入镜像
# -d 参数表示后台运行
docker run -itd [CONTAINER ID]
# --name 该参数将会给你启动的镜像设置一个别名
docker run -itd --name [别名] [CONTAINER ID]

如果进去了镜像,想要退出:

控制输入:

1
2
# 容器停止退出
exit

如果只想退出,容器继续运行

1
2
# 容器不停止退出
CTRL+P+Q

MongoDB的docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3"
services:
mongodb:
image: mongo:latest
container_name: mongodb
restart: always
volumes:
- ./data:/data/db
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: 123456

在Docker容器中运行MongoDB数据库时,通常不需要指定command: [–auth]参数。这是因为,在MongoDB 3.0以后的版本中,认证功能是默认启用的。也就是说,只要在MongoDB数据库中创建了用户,就必须使用用户名和密码来进行连接。

如果在Docker容器中运行的是MongoDB 3.0之前的版本,则可能需要指定command: [–auth]参数,才能启用认证功能。例如,可以使用如下的内容作为docker-compose.yml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3"
services:
mongodb:
image: mongo:3.6
container_name: mongodb
restart: always
volumes:
- ./data:/data/db
ports:
- "27017:27017"
command: [--auth]
environment:
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: 12345

MySQL的docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3"
services:
mysql:
image: mysql:latest
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: my_db
ports:
- "3306:3306"
volumes:
- "./mysql:/var/lib/mysql"
- "./mysql-data:/var/lib/mysql-data"

Redis的docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: "3"
services:
redis:
image: redis:6
container_name: redis
environment:
REDIS_PASSWORD: password
ports:
- "6379:6379"
volumes:
- "./redis:/data"
1
2
3
4
5
6
7
version: '3'
services:
redis:
image: redis
ports:
- 6379:6379
command: redis-server --bind 0.0.0.0 -a <password>

Docker Hub

要推送Docker镜像到Docker Hub,需要按照以下步骤进行操作:

  1. 登录Docker Hub,使用您的用户名和密码进行登录。
  2. 在Docker Hub上创建一个新的仓库,用于存储您的镜像。
  3. 在终端中运行以下命令,将镜像标记为您的Docker Hub用户名和仓库名:
1
2

$ docker tag <image> <your_username>/<repository_name>:<tag>

例如:

1
2

$ docker tag my_image username/my_repo:latest
  1. 运行以下命令,推送标记的镜像到Docker Hub:
1
2

$ docker push <your_username>/<repository_name>:<tag>

例如:

1
2

$ docker push username/my_repo:latest

在这些命令完成后,您的镜像就会被推送到Docker Hub,并可以供其他用户使用。