Docker安装

使用官方安装脚本自动安装

(仅适用于公网环境)

1
$ curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

手动安装docker

CentOS安装

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
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
sudo systemctl start docker

注意:其他注意事项在下面的注释中
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
# 将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
# Loading mirror speeds from cached hostfile
# Loaded plugins: branch, fastestmirror, langpacks
# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable
# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable
# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
# Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]
# 注意:在某些版本之后,docker-ce安装出现了其他依赖包,如果安装失败的话请关注错误信息。例如 docker-ce 17.03 之后,需要先安装 docker-ce-selinux。
# yum list docker-ce-selinux- --showduplicates | sort -r
# sudo yum -y install docker-ce-selinux-[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2中的命令
# 经典网络:
# sudo yum-config-manager --add-repo http://mirrors.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo
# VPC网络:
# sudo yum-config-manager --add-repo http://mirrors.could.aliyuncs.com/docker-ce/linux/centos/docker-ce.repo

ubuntu (使用apt-get进行安装)

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
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce

注意:其他注意事项在下面的注释中
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
# docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

# 通过经典网络、VPC网络内网安装时,用以下命令替换Step 2、Step 3中的命令
# 经典网络:
# curl -fsSL http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# VPC网络:
# curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

安装校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@iZbp12adskpuoxodbkqzjfZ:$ docker version
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64

Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 07:52:04 2017
OS/Arch: linux/amd64
Experimental: false

配置代理源

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://es8yt4u0.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

国内镜像源

1
2
3
4
5
6
7
8
9
10
11
12
{
"registry-mirrors": ["https://docker.hpcloud.cloud",
"https://docker.m.daocloud.io",
"https://docker.unsee.tech",
"https://docker.1panel.live",
"http://mirrors.ustc.edu.cn",
"https://docker.chenby.cn",
"http://mirror.azure.cn",
"https://dockerpull.org",
"https://dockerhub.icu",
"https://hub.rat.dev"]
}

重启

1
2
sudo systemctl daemon-reload		#重启daemon进程
sudo systemctl restart docker #重启docker

Docker命令

基本启动

设置自启动

1
sudo systemctl enable docker

查看是否设置成功

1
systemctl list-unit-files | grep docker

启动docker

1
systemctl start docker

查看运行状态

1
systemctl status docker

添加自启动

1
systemctl enable docker

停止docker

1
systemctl stop docker

镜像命令

查看所有镜像

1
docker images

搜索镜像

1
docker search 镜像名字

拉取镜像

1
docekr pull centos:7
  • 7表示版本

不选择版本则默认latest最后一个版本

删除镜像

删除指定镜像

1
docker rmi 镜像ID或者镜像名称  #建议用ID

删除所有镜像

1
docker rmi `docker images -q`

容器命令

容器设置自动启动

1
docker update --restart=always 容器名称

查看Docker容器是否设置了开机启动

主要是用format查看容器的基本信息确定查看是否设置了自启

1
docker container inspect --format='{{.HostConfig.RestartPolicy.Name}}' 容器名称或ID

启动容器

1
docker start 容器ID

进入容器

1
docker exec -it 088886008b7a /bin/bash
  • i表示运行
  • t表示进入终端搭配/bin/bash使用

查看正在运行的容器

1
docker ps

查看所有容器

1
docker ps -a

查看最后一次运行的容器

1
docker ps -l

查看停止的容器

1
docker ps -f status=exited

删除容器

删除容器之前需要确保容器停止运行,docker stop 容器ID

1
docker rm 容器ID

创建与启动容器

创建容器命令

1
docker run
  • -i:表示运行容器
  • -t:表示容器启动后会进入命令行。加入这俩参数后,容器创建就能登录进去。即分配一个伪终端。
  • --name :为创建的容器命名。
  • -v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
  • -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加–t两个参数,创建后就会自动进去容器)。
  • -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

交互式方式创建容器

1
docker run -it --name=容器名称 镜像名称:标签 /bin/bash

例如:创建一个名字为mycentoscentos容器

1
docker run -it --name=mycentos centos:7 /bin/bash
  • -it表示创建完成后运行容器并(t)进去命令行
  • /bin/bash表示终端(命令行)

如果不带版本号则默认latest最后一个版本

创建完成后发现localhost变成了容器ID,表示当前已经进入到容器内了

这时通过ps命令查看,发现可以看到启动的容器,状态为启动状态

退出当前容器

1
exit

守护式创建容器

如果用守护方式创建容器,登陆后即使退出,他也是运行状态

1
docker run -di --name=容器名称 镜像名称:标签

例如创建一个名字为mycentoscentos容器

1
docker run -it --name=mycentos centos:7
  • t表示后台运行

则不需要加入/bin/bash终端了

进入容器

1
docker exec -it 088886008b7a /bin/bash

停止容器

1
docker stop 容器ID

容器主机互传文件

宿主机与容器拷贝文件

我们有时候会遇到一些情况,需要将宿主机的文件拷入容器内对应的目录

将宿主机文件考入容器

1
docker cp 文件 容器ID:容器目录

例如将file.rar文件拷入容器内的/usr/local目录下

1
docker cp /var/file.rar 088886008b7a:/usr/local

容器文件拷到宿主机

需要在宿主机的终端内执行命令

1
docker cp 容器ID/目录/filename

例如将容器内的/usr/local/2.txt文件拷到主机的当前目录下

1
docker cp 088886008b7a:/usr/local/2.txt 2.txt

088886008b7a容器ID也可以用容器名称

目录挂载

在上面容器与主机传文件的时候并不是很方便,这个时候docker有一个-v目录的挂载

我们可以在创建容器的时候,江苏主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机的某个目录的文件从而去影响容器

首先在主机下创建一个容器挂在的目录,然后映射到容器内的某个目录

例如,将宿主机的/usr/local/mydata目录挂载到容器的/usr/local/mydata

首先创建文件目录mkdir /usr/local/mydata

1
docker run -di -v /usr/local/mydata:/var/local/mydata --name=mysql3 centos:7

第一个路径是主机路径,第二个路径是容器路径

然后我们在宿主机内的/usr/local/mydata目录下创建一个1.txt文件,然后再去容器内的/usr/local/mydata目录查看是否存在

1
2
3
touch /usr/local/mydata/1.txt	#创建文件
docker exec -it mycentos3 /bin/bash #进入容器
ls /usr/local/mydata #查看是否存在

查看容器内的运行数据

1
docker inspect 容器名或ID

例如

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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
[root@localhost games]# docker inspect mycentos3
[
{
"Id": "8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc",
"Created": "2025-01-02T08:49:13.666517689Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 5843,
"ExitCode": 0,
"Error": "",
"StartedAt": "2025-01-02T08:49:14.044283552Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc/hostname",
"HostsPath": "/var/lib/docker/containers/8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc/hosts",
"LogPath": "/var/lib/docker/containers/8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc/8d2c6a78ff45510976f917aa9b7a7b4c7c2985cb9fc8df9a178039a247d7dacc-json.log",
"Name": "/mycentos3",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": [
"b54db463456421c8b5bf777d922bd0bd370cefda68eae822d94a59f9dd481970"
],
"HostConfig": {
"Binds": [
"/usr/local/mydata:/usr/local/mydata"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "bridge",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
41,
148
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": [],
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware",
"/sys/devices/virtual/powercap"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/ee44121eac37ae22db75a5ab80c9de584d250e58597c40873a4d6492a27bd9d8-init/diff:/var/lib/docker/overlay2/3175a1d61e49a8cf107a2793043510007ae78db94b4c7d6852e090dedaae8d36/diff",
"MergedDir": "/var/lib/docker/overlay2/ee44121eac37ae22db75a5ab80c9de584d250e58597c40873a4d6492a27bd9d8/merged",
"UpperDir": "/var/lib/docker/overlay2/ee44121eac37ae22db75a5ab80c9de584d250e58597c40873a4d6492a27bd9d8/diff",
"WorkDir": "/var/lib/docker/overlay2/ee44121eac37ae22db75a5ab80c9de584d250e58597c40873a4d6492a27bd9d8/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/usr/local/mydata",
"Destination": "/usr/local/mydata",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "8d2c6a78ff45",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": true,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "363adcb3658c6f78273717769c2a841384dbb218b315d44228d0570b893f7c46",
"SandboxKey": "/var/run/docker/netns/363adcb3658c",
"Ports": {},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "4752889635dc6ec69e983f33db097870d0f17778b6f803e418855fa4152ad491",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:04",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"MacAddress": "02:42:ac:11:00:04",
"NetworkID": "9d87498b72d9c6675c74c723ec8bbe8e319796eb810ecb7677bdf815ef97461c",
"EndpointID": "4752889635dc6ec69e983f33db097870d0f17778b6f803e418855fa4152ad491",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DriverOpts": null,
"DNSNames": null
}
}
}
}
]

可以发现内容很长,如果想要对单独的信息进行查看可以用format,例如想要查看ip地址(NetworSettings)

1
docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3

导入导出镜像

导出

1
docker export 02b4538e8022 > centos.tar

导入

1
docker import centos.tar

可能出现的问题

dockerREPOSITORYnone

解决方法:

1
docker tag 779b77ae51a7 centos:latest

语法:docker tag [IMAGE ID] [REPOSITORY名]:[TAG标识]

Docker常用环境部署

部署Mysql

拉取镜像

1
docker pull mysql:5.7

这里我拉取5.7的版本

创建容器

这里需要做端口映射

1
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • -p:端口映射
  • 3306:为端口映射的参数。第一个3306表示主机的3306端口,第二个表示映射容器的3306端口。
  • -e:表示添加环境变量,因为安装好的mysql容器并不知道它的root密码是多少,所以通过添加环境变量,直接将mysql的root密码进行更改

连接容器

1
docker exec -it mysql /bin/bash

登录mysql并设置UTF-8编码

1
mysql -uroot -proot --default-character-set=utf8

然后正常进入没有问题,接下来尝试Navicat工具进行连接

正常连接

部署Nginx

拉取镜像

1
docker pull nginx

这里就用latest版本吧

创建容器

方法1

需要二次配置目录挂载

第一次用普通的挂载,将容器内整个/etc/nginx/文件夹都挂载了,访问挺正常,但是更改了主页目录后就出现了错误

nginx -t一直显示nginx.conf文件内的一行错误

初步判断是目录丢失的原因,因为我只挂在了整个nginx目录

首先创建容器/var/www/nginx2/是我本机的nginx配置文件夹

1
docker run -di -v /var/www/nginx2/:/etc/nginx --name=mynginx -p 9092:80 nginx

方法2✔

首先创建一个容器,用于拷贝出来它的nginx配置文件

1
docker run -di --name=mynginx -p 9091:80 nginx

目录挂载

一般网页页面需要多次更改文件,因为做目录挂载也是很有必要的,不过需要注意,想要挂载需要先创建nginx容器,然后将nginx的配置文件/etc/nginx拷贝到宿主机后再将宿主机的nginx配置文件挂载到容器目录下

需要先创建三个文件用于挂载不同的文件

1
2
3
4
5
6
# 创建www目录
mkdir -p /server/nginx/html
# 创建日志目录
mkdir -p /server/nginx/logs
# 创建配置目录
mkdir -p /server/nginx/conf

然后把配置文件拷贝出来

1
docker cp nginx:/etc/nginx/nginx.conf /server/nginx/conf/nginx.conf

拷贝完配置文件后需要把测试运行的容器停掉,然后再删除容器

1
docker stop nginx
1
docker rm nginx

开始做映射挂载

默认nginx主页目录在/usr/share/nginx/html文件夹下

配置文件在/etc/nginx/nginx.conf

日志文件在/var/log/nginx

1
docker run -d -p 9091:80 --name nginx -v /server/nginx/html:/usr/share/nginx/html -v /server/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /server/nginx/logs:/var/log/nginx --privileged=true nginx

连接容器

1
docker exec -it mynginx /bin/bash

修改配置nginx文件

需要先把nginx的配置文件拷贝出来

nginx命令

1
2
3
4
5
6
7
8
#检查语法是否有误
nginx -t
# 重新载入配置文件
nginx -s reload
# 重启 Nginx
nginx -s reopen
# 停止 Nginx
nginx -s stop