0%

Docker

Docker

docker安装

1.删除旧版
1
2
sudo yum update
yum remove docker
2.配置docker的yum仓库

首先要安装一个yum工具

1
yum install -y yum_utils

安装成功后,执行Docker的yum源:

1
2
3
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3.安装docker引擎
1
sudo yum install docker-ce docker-ce-cli containerd.io
4.启动Docker
1
2
3
4
5
6
7
8
启动
sudo systemctl start docker
停止
sudo systemctl stop docker
重启
sudo systemctl restart docker

docker ps(执行该命令如果不报错,就说明安装成功 )
5.测试 Docker 是否安装正常
1
sudo docker run hello-world
6.配置镜像加速器

阿里云

1
https://cr.console.aliyun.com/undefined/instances/mirrors

针对Docker客户端版本大于 1.10.0 的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,如果没有daemon则新建

1
2
3
4
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

7.重启docker
1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

mysql部署

1.镜像下载
1
2
docker pull mysql   下载最新版Mysql镜像 (其实此命令就等同于 : docker pull mysql:latest )
docker pull mysql:xxx 下载指定版本的Mysql镜像 (xxx指具体版本号)
2.检查当前所有Docker下载的镜像
1
docker images
3、创建Mysql容器并运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#Docker 创建Mysql容器
docker run \
--name mysql \
-d \
-p 3306:3306 \
--restart unless-stopped \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7
#命令解读
#命令 描述
docker run 创建一个新的容器 , 同时运行这个容器
–name mysql 启动容器的名字
-d 后台运行
-p 3306:3306 将容器的 3306 (后面那个) 端口映射到主机的 3306 (前面那个) 端口
–restart unless-stopped 容器重启策略
-v /mydata/mysql/log:/var/log/mysql 将日志文件夹挂载到主机
-v /mydata/mysql/data:/var/lib/mysql 将mysql储存文件夹挂载到主机
-v /mydata/mysql/conf:/etc/mysql 将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root 设置 root 用户的密码
mysql:5.7 (不写:5.7,默认最新版) 启动哪个版本的 mysql (本地镜像的版本)
\ shell 命令换行符
4、查看Mysql是否运行
1
2
3
4
5
6
7
### 查看Docker运行中的容器
docker ps
## 通过Docker命令进入Mysql容器内部
docker exec -it mysql /bin/bash
## 或者
#进入容器内部
docker exec -it mysql bash
5.客户端连接
6.镜像和容器

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用
运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。

入门基础

常见命令

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#查看镜像
docker images

#删除镜像
docker rmi

#查看docker 版本号信息
docker version

docker info #docker系统信息

#docker 帮助命令
docker --help
docker pull --help

#搜索镜像
docker search 镜像名
docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
(可以在官网找到对应版本直接pull)

#查看日志
docker logs --tail 50 --follow --timestamps mysql

#查看容器中进程信息
docker top 容器id

#查看容器信息
docker ps

#查看全部容器信息
docker ps -a

#查看容器镜像的详细信息/镜像元数据
docker inspect 容器id

#容器启动与关闭
docker start/stop/kill/ 镜像/容器id

#登录与登出
docker login/logout

## 通过Docker命令进入Mysql容器内部 打开一个新的终端
docker exec -it mysql /bin/bash
## 或者
#进入容器内部
docker exec -it mysql bash

#方式2 进入容器正在执行的终端,不会启动新的进程
docker attach 容器id /bin/bash

#容器内文件拷贝
docker cp 容器id:容器内路径 目的主机路径


1
2
3
4
5
6
7
8
9
10
11
12
docker run参数
-d: 后台运行容器并返回容器 ID。
-it: 交互式运行容器,分配一个伪终端。
--name: 给容器指定一个名称。
-p: 端口映射,格式为 host_port:container_port。
-P:随机指定端口
-v: 挂载卷,格式为 host_dir:container_dir。
--rm: 容器停止后自动删除容器。
--env 或 -e: 设置环境变量。
--network: 指定容器的网络模式。
--restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。
-u: 指定用户。

直接运行docker run 不拉去镜像也能启动容器,不过当停止容器时会自动释放掉容器的所有内容

命令别名

1
alias [别名]=[需要别名的命令] 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#永久生效
vim /root/.bashrc

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi

删除镜像

直接查看

1
docker ps -a

不带-a是查看所有已运行中的容器。

过滤查看

1
docker ps -a|grep xxx

查看所有退出的容器id列表

1
docker ps -a|grep Exited|awk '{print $1}'

删除指定容器

1
2
3
docker rm id/名称

docker rm -f id/名称

条件删除删除未启动容器

1
docker rm $(docker ps -a| grep Created|awk '{print $1}')

删除所有容器

1
docker rm $(docker ps -a -q)

如果要停止所有,把rm换成stop即可。

删除所有镜像

1
docker rmi $(docker images -q)

修改容器端口映射

方法一: 删除原有容器,重新建新容器

这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上端口映射。

1
2
docker run -d -uroot -p 8989:8080 --name jenkins1 -v /home/xianyudoufu/jenkins_node:/var/jenkins_home jenkins/jenkins:2.289.3-cen
tos

优缺点:优点是简单快捷,在测试环境使用较多。缺点是如果是数据库镜像,那重新建一个又要重新配置一次,就会比较麻烦。

方法二:修改容器配置文件,重启docker服务

今天我需要新增一个端口,就是通过这个方式处理的,亲测有效。

首先关闭docker服务

1
systemctl stop docker

关闭之后,找到容器的配置文件路径,通常都是安装在这个路径下方

1
cd /var/lib/docker/containers

然后我们在ls查看一下容器,找我们想要修改的容器ID
修改容器中的 hostconfig.json 文件

1
vi 容器ID hostconfig.json

如上图,文件中其中有一项是PortBindings,其中8080/tcp对应的是容器内部的8080端口,HostPort对应的是映射到宿主机的端口8989。8361/tcp对应的是容器内部的8361端口,HostPort对应的是映射到宿主机的端口9999,按需修改端口。

修改容器中 config.v2.json 文件

1
vi 容器ID /config.v2.json 

这里面是容器原本的端口号,检查一下对不对,不对的话进行修改

全部弄好之后,启动容器

1
systemctl start docker

优缺点:这个方法的优点是没有副作用,操作简单。缺点是需要重启整个docker服务,如果在同一个宿主机上运行着多个容器服务的话,就会影响其他容器服务。

方法三:利用docker commit新构镜像

docker commit:把一个容器的文件改动和配置信息commit到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。

停止docker容器

1
docker stops container01

commit该docker容器

1
docker commit container01 new_image:tag

用前一步新生成的镜像重新起一个容器

1
docker run --name container02 -p 80:80 new_image:tag

优缺点:这种方式的优点是不会影响统一宿主机上的其他容器,缺点是管理起来显得比较乱,没有第二种方法那么直观。

docker容器正在启动中无法exec控制容器错误排查

现象

1
2
3
[root@localhost ~]# docker exec -it mysql bash
Error response from daemon: Container 86a52dd7c0252d6ec55e365dc6aa199be5f6d682112d7f2f3341fb2e8fecb283 is restarting, wait until the container is running

(1)查看容器是否启动

1
2
3
4
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
86a52dd7c025 mysql "docker-entrypoint.s…" 13 minutes ago Restarting (1) 32 seconds ago mysql

容器启动,状态Restarting,端口空白

(2)查看端囗是否被占用

以为一直主机上已经有MySQL,启动容器时已经将容器3306映射到主机的3307

1
[root@localhost ~]# lsof -i:3307

现在主机端口3307未被占用,

(3)查看docker日志

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[root@localhost ~]# docker logs --tail 50 --follow --timestamps mysql 
2025-01-20T08:20:26.734594188Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:20:26.734698588Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:20:40.377050799Z 2025-01-20 08:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:20:40.419462151Z 2025-01-20 08:20:40+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:20:40.419505081Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.8250f3JkdC
2025-01-20T08:20:40.419515251Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:20:40.419549450Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:20:40.419563941Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:21:13.680145697Z 2025-01-20 08:21:13+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:21:13.717457825Z 2025-01-20 08:21:13+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:21:13.717596515Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.TYh3CpN1u8
2025-01-20T08:21:13.717636655Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:21:13.717798115Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:21:13.717837625Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:22:05.745368974Z 2025-01-20 08:22:05+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:22:05.789739896Z 2025-01-20 08:22:05+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:22:05.789822966Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.C05n80Ysco
2025-01-20T08:22:05.789859597Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:22:05.789893527Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:22:05.789927187Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:23:12.645946982Z 2025-01-20 08:23:12+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:23:12.684595612Z 2025-01-20 08:23:12+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:23:12.684630352Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.1rB9VCkp64
2025-01-20T08:23:12.684640702Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:23:12.684649972Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:23:12.684659332Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:24:24.216607747Z 2025-01-20 08:24:24+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:24:24.257900368Z 2025-01-20 08:24:24+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:24:24.257941768Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.6GSe4KbVW1
2025-01-20T08:24:24.257954068Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:24:24.257965368Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:24:24.257976968Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:25:29.659499906Z 2025-01-20 08:25:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:25:29.700926926Z 2025-01-20 08:25:29+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:25:29.701021426Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.a8mWSG80iJ
2025-01-20T08:25:29.701061526Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:25:29.701099426Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:25:29.701290726Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:26:34.665746987Z 2025-01-20 08:26:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:26:34.706785408Z 2025-01-20 08:26:34+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:26:34.706926808Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.iW6BztAeCU
2025-01-20T08:26:34.707219808Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:26:34.707260608Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:26:34.707302108Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:27:39.135705165Z 2025-01-20 08:27:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:27:39.176601786Z 2025-01-20 08:27:39+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:27:39.176695586Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.6Qbbqnndbq
2025-01-20T08:27:39.176736686Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory)
2025-01-20T08:27:39.176774786Z mysqld: [ERROR] Stopped processing the 'includedir' directive in file /etc/my.cnf at line 32.
2025-01-20T08:27:39.176812086Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!

其中:主要下面几种报错循环报错

1
2
3
4
5
2025-01-20T08:26:34.707302108Z mysqld: [ERROR] Fatal error in defaults handling. Program aborted!
2025-01-20T08:27:39.135705165Z 2025-01-20 08:27:39+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 9.1.0-1.el9 started.
2025-01-20T08:27:39.176601786Z 2025-01-20 08:27:39+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
2025-01-20T08:27:39.176695586Z command was: mysqld --verbose --help --log-bin-index=/tmp/tmp.6Qbbqnndbq
2025-01-20T08:27:39.176736686Z mysqld: Can't read dir of '/etc/mysql/conf.d/' (OS errno 2 - No such file or directory) #这个报错指不能找到conf.d文件

从上面报错信息可以看出 mysqld: Can’t read dir of ‘/etc/mysql/conf.d/‘ (无法读取/etc/mysql/conf.d/目录)。这样就知道原因了,mysql找不到conf.d目录。所以启动容器时指定到conf.d目录

修改创建容器的的语句,

1
2
3
4
5
6
7
8
9
10
11
12
#Docker 创建Mysql容器
#-p参数中port1:port2 port1是主机端口 port2是容器端口
docker run \
--name mysql \
-d \
-p 3307:3306 \
--restart unless-stopped \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf/:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
1
2
3
4
5
docker run -p 3307:3306 --privileged=true \
-v /mysql/data:/var/lib/mysql \
-v /mysql/log:/var/log/mysql \
-v /mysql/conf:/etc/mysql/conf.d \ #如果需要给mysql进行配置,可以将配置文件写入conf映射到容器里
-e MYSQL_ROOT_PASSWORD=123456 --name=mysql-server -d mysql

远程连接mysql

1
2
3
4
5
6
7
8
#创建一个新的用户或者授权现有用户(如果已存在):
CREATE USER 'root'@'%' IDENTIFIED BY 'password';
#或者
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
#刷新权限:
FLUSH PRIVILEGES;
#其中,'root'@'%'表示任何IP地址的客户端都可以用root用户连接到服务器,'password'是你为root用户设置的密码。
#请确保你的防火墙允许3306端口(或你自定义的MySQL端口)的入站连接。

后台启动应用避雷

我们 docker run 启动容器的时候,常需要将其在后台运行,通常我们设置参数 -d 即可。

但后台运行,其实是有前提的,如果没有前台进程,那么实际运行完docker run命令后,会处于退出状态,即exited。

1
2
3
#例子:
docker run -d --name my-redis redis bash
# 指定命令是bash,但显然bash在容器起来后,很快就会结束,导致没有前台进程,故容器处于退出状态

Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。
而上面的代码中bash就是需要执行的指定的命令。
命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。

解决办法

目前了解的可以使用以下3种方法,具体用哪种方法,依据实际情况,生产情况下,通常用docker-compose结合具体cmd作为容器初起的命令。

1.指定挂起阻塞命令启动容器

1
docker run -d --name my-redis redis sleep 99999999999999

命令执行后,通过**docker ps -a | grep my-redis,可以看到容器处于运行状态,即up**。

2.使用交互界面后退出容器

1
docker run -it --name my-redis redis bash

之后会进入容器,如果想保持容器后台运行,我们可以 **Ctrl + p + q,再次查看容器运行状态,也可以看到容器处于up**状态。

3.-td命令结合使用

1
2
docker run -itd --name my-redis2 redis bash
# -i 不是必需,加了,容器起来后终端返回容器ID

刚也提到,就是-d运行容器时,需要有前台进程,-t提供一个伪终端,类似前台进程,查看容器运行状态,也可以看到,容器处于**up**状态。

docker 安装nginx

1、用 docker search nginx 命令来查看可用版本:

1
docker search nginx

2、取最新版的 Nginx 镜像

这里我们拉取官方的最新版本的镜像:

1
docker pull nginx:latest

3、查看本地镜像

使用以下命令来查看是否已安装了 nginx:

1
docker images

4、运行容器

安装完成后,我们可以使用以下命令来运行 nginx 容器:

1
docker run --name nginx-test -p 8080:80 -d nginx

参数说明:

  • –name nginx-test:容器名称。
  • -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
  • -d nginx: 设置容器在在后台一直运行

docker 安装tomcat

其他步骤与mysql和nginx相同

1
docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat 容器id

-p 8080:8080:将主机的 8080 端口映射到容器的 8080 端口。

-v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的 test 挂载到容器的 /test。

容器数据卷

1.直接使用命令挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -it -v host_dir:container_dir
#容器内目录与容器外目录进行双向绑定

# 查看所有数据卷
docker volume ls

# 查看数据卷详细信息
docker volume inspect volume_name

# 删除指定数据卷
docker volume rm volume_name

# 删除所有未使用的数据卷
docker volume prune

2.具名挂载和匿名挂载

1
2
3
4
5
6
7
8
9
10
#匿名挂载(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01

#具名挂载(命名卷) -v 宿主机数据卷所在路径:容器数据卷所在路径
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01


#查看所有的volume的情况
docker volume ls

数据卷的权限设置:

1
2
3
4
5
# 只读挂载
docker run -v volume_name:/container/path:ro

# 读写挂载(默认)
docker run -v volume_name:/container/path:rw

容器数据卷

1
2
3
#容器间数据共享,只要一个容器还在数据就不会丢失
docker run -it --name docker01 tyc10/centos
docker run -it --name docker02 --volumes-from docker01 tyc10/centos
1
2
3
4
docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7


docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

容器间配置信息的传递,数据卷容器生命周期一直持续到没有容器使用为止

一旦 -v 持久化到本地,就不会删除

dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
FROM            # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

docker网络互联

自定义网络

1
2
3
4
5
6
7
8
9
10
11
# 我们直接启动的命令 --net bridge,而这个就是我们得docker0
# bridge就是docker0
$ docker run -d -P --name tomcat01 tomcat
等价于 => docker run -d -P --name tomcat01 --net bridge tomcat

# docker0,特点:默认,容器名不能访问。 --link可以打通连接,但是很麻烦!
# 我们可以 自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

redis集群

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# 创建网卡
docker network create redis_net --subnet 172.38.0.0/16

# 通过脚本创建六个redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

# 通过脚本运行6个redis
for port in $(seq 1 6);\
docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 手动创那家6个redis
# 创建结点1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#创建结点2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /mydata/redis/node-2/data:/data \
-v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#创建结点3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /mydata/redis/node-3/data:/data \
-v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#创建结点4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /mydata/redis/node-4/data:/data \
-v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#创建结点5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /mydata/redis/node-5/data:/data \
-v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
#创建结点6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /mydata/redis/node-6/data:/data \
-v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis_net --ip 172.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf


# 创建集群
docker exec -it redis-1 /bin/sh #redis默认没有bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

基础命令总结

1. Docker运行

要在Docker中运行容器,可以使用以下命令:

1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • docker run:运行容器的命令。
  • [OPTIONS]:可选参数,用于配置容器的各种选项,如端口映射、容器名称等。
  • IMAGE:要运行的镜像名称或ID。
  • [COMMAND] [ARG...]:可选的命令和参数,用于在容器内执行特定的命令。

2. Docker构建

要构建自己的Docker镜像,可以使用以下命令:

1
docker build [OPTIONS] PATH | URL | -
  • docker build:构建镜像的命令。
  • [OPTIONS]:可选参数,用于配置构建过程,如镜像标签、构建上下文路径等。
  • PATH | URL | -:Dockerfile所在的路径、URL或者使用标准输入作为Dockerfile。

3. Docker pull

要从Docker仓库中拉取现有的镜像,可以使用以下命令:

1
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
  • docker pull:拉取镜像的命令。
  • [OPTIONS]:可选参数,用于配置拉取过程,如认证信息等。
  • NAME[:TAG|@DIGEST]:要拉取的镜像名称、标签或摘要。

4. Docker push

要将本地的镜像推送到Docker仓库,可以使用以下命令:

1
docker push [OPTIONS] NAME[:TAG]
  • docker push:推送镜像的命令。
  • [OPTIONS]:可选参数,用于配置推送过程,如认证信息等。
  • NAME[:TAG]:要推送的镜像名称和标签。

5. Docker images

要列出本地所有的镜像,可以使用以下命令:

1
2
docker images [OPTIONS] [REPOSITORY[:TAG]]
1
  • docker images:列出镜像的命令。
  • [OPTIONS]:可选参数,用于配置输出结果的格式等。
  • [REPOSITORY[:TAG]]:可选的镜像名称和标签,用于过滤输出结果。

6. Docker ps

要列出正在运行的容器,可以使用以下命令:

1
2
docker ps [OPTIONS]
1
  • docker ps:列出容器的命令。
  • [OPTIONS]:可选参数,用于配置输出结果的格式和过滤条件。

7. Docker stop

要停止正在运行的容器,可以使用以下命令:

1
2
docker stop [OPTIONS] CONTAINER [CONTAINER...]
1
  • docker stop:停止容器的命令。
  • [OPTIONS]:可选参数,用于配置停止过程,如超时时间等。
  • CONTAINER [CONTAINER...]:要停止的容器名称或ID。

8. Docker start

要启动已停止的容器,可以使用以下命令:

1
2
docker start [OPTIONS] CONTAINER [CONTAINER...]
1
  • docker start:启动容器的命令。
  • [OPTIONS]:可选参数,用于配置启动过程,如守护模式等。
  • CONTAINER [CONTAINER...]:要启动的容器名称或ID。

9. Docker restart

要重启正在运行的容器,可以使用以下命令:

1
2
docker restart [OPTIONS] CONTAINER [CONTAINER...]
1
  • docker restart:重启容器的命令。
  • [OPTIONS]:可选参数,用于配置重启过程,如超时时间等。
  • CONTAINER [CONTAINER...]:要重启的容器名称或ID。

10. Docker kill

要强制终止正在运行的容器,可以使用以下命令:

1
2
docker kill [OPTIONS] CONTAINER [CONTAINER...]
1
  • docker kill:终止容器的命令。
  • [OPTIONS]:可选参数,用于配置终止过程,如信号等。
  • CONTAINER [CONTAINER...]:要终止的容器名称或ID。

11. Docker rm/docker rmi

要删除已停止的容器或镜像,可以使用以下命令:

1
2
docker rm [OPTIONS] CONTAINER [CONTAINER...]   docker rmi [OPTIONS] IMAGE [IMAGE...]
1
  • docker rm:删除容器的命令。
  • docker rmi:删除镜像的命令。
  • [OPTIONS]:可选参数,用于配置删除过程,如强制删除等。
  • CONTAINER [CONTAINER...]:要删除的容器名称或ID。
  • IMAGE [IMAGE...]:要删除的镜像名称或ID。

12. Docker exec

要在运行中的容器内执行命令,可以使用以下命令:

1
2
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
1
  • docker exec:在容器内执行命令的命令。
  • [OPTIONS]:可选参数,用于配置执行过程,如进入交互模式等。
  • CONTAINER:要执行命令的容器名称或ID。
  • COMMAND [ARG...]:要在容器内执行的命令及其参数。

13. Docker logs

要查看容器的日志输出,可以使用以下命令:

1
2
docker logs [OPTIONS] CONTAINER
1
  • docker logs:查看容器日志的命令。
  • [OPTIONS]:可选参数,用于配置输出结果,如时间戳等。
  • CONTAINER:要查看日志的容器名称或ID。

14. Docker inspect

要获取容器或镜像的详细信息,可以使用以下命令:

1
2
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
1
  • docker inspect:获取详细信息的命令。
  • [OPTIONS]:可选参数,用于配置输出结果的格式等。
  • NAME|ID [NAME|ID...]:要获取信息的容器或镜像的名称或ID。

15. Docker cp

要在容器和主机之间复制文件或目录,可以使用以下命令:

1
2
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH   docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
1
  • docker cp:复制文件或目录的命令。
  • [OPTIONS]:可选参数,用于配置复制过程,如权限等。
  • CONTAINER:SRC_PATH:源路径,其中CONTAINER是容器名称或ID。
  • DEST_PATH:目标路径,其中DEST_PATH是主机路径。
  • SRC_PATH|-:源路径,其中-表示从标准输入读取。

16. Docker system prune

要清理不再使用的镜像、容器和其他资源,可以使用以下命令:

1
2
docker system prune [OPTIONS]
1
  • docker system prune:清理资源的命令。
  • [OPTIONS]:可选参数,用于配置清理过程,如强制删除等。

17. Docker network

Docker网络允许容器之间进行通信和连接到外部网络。以下是一些与Docker网络相关的常用命令:

  • docker network ls:列出所有的Docker网络。
  • docker network create:创建一个新的Docker网络。
  • docker network connect:将容器连接到指定的Docker网络。
  • docker network disconnect:将容器从指定的Docker网络断开连接。

18. Docker volume

Docker卷用于在容器和主机之间持久化存储数据。以下是一些与Docker卷相关的常用命令:

  • docker volume ls:列出所有的Docker卷。
  • docker volume create:创建一个新的Docker卷。
  • docker volume inspect:获取Docker卷的详细信息。
  • docker volume rm:删除指定的Docker卷。

19. Docker-compose

Docker-compose是一个用于定义和运行多个容器应用程序的工具。它使用YAML文件来配置应用程序的服务、网络和卷等。以下是一些与Docker-compose相关的常用命令:

  • docker-compose up:构建并启动Docker-compose定义的所有服务。
  • docker-compose down:停止并删除Docker-compose定义的所有服务。
  • docker-compose build:构建Docker-compose定义的所有服务的镜像。
  • docker-compose logs:查看Docker-compose定义的所有服务的日志。

20. Docker swarm

Docker swarm是Docker的原生集群管理和编排工具,用于在多个Docker主机上运行和管理应用程序。以下是一些与Docker swarm相关的常用命令:

  • docker swarm init:初始化一个新的Docker swarm集群。
  • docker swarm join:将节点加入到Docker swarm集群。
  • docker node ls:列出Docker swarm集群中的所有节点。
  • docker service:管理在Docker swarm集群中运行的服务。

21. Dockerfile

Dockerfile是用于定义Docker镜像构建过程的文本文件。它包含一系列的指令和配置,用于指导Docker引擎在构建过程中执行特定的操作。以下是一些与Dockerfile相关的常用命令:

  • FROM:指定基础镜像。
  • RUN:在容器内执行命令。
  • COPY:将文件或目录从主机复制到容器内。
  • ADD:将文件或目录从主机复制到容器内,并支持URL和解压缩操作。
  • WORKDIR:设置工作目录。
  • EXPOSE:声明容器运行时监听的端口。
  • CMD:指定容器启动时要执行的命令。

这些命令可以在Dockerfile中按照特定的顺序组合使用,以定义和构建自定义的Docker镜像。

22. Docker登录和认证

要登录到Docker仓库或私有镜像仓库,可以使用以下命令:

  • docker login:登录到Docker仓库。
  • docker logout:退出登录。

登录后,您可以使用docker pulldocker push命令来拉取和推送镜像。

23. Docker容器日志管理

除了使用docker logs命令查看容器日志外,还可以使用以下命令对容器日志进行管理:

  • docker logs --tail:只显示最后几行的日志。
  • docker logs --follow:实时跟踪容器的日志输出。
  • docker logs --since:只显示特定时间之后的日志。
  • docker logs --until:只显示特定时间之前的日志。