安装Docker
#docker分为企业版和社区版
企业版 : docker
社区版 : docker-ce
#安装依赖
[root@docker ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
#安装阿里云源仓库
[root@docker ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#查看docker版本
[root@docker ~]# yum list docker-ce --showduplicates | sort -r
#选择最新的19版本,进行安装
[root@docker ~]# yum install -y docker-ce-19.03.9
[root@docker ~]# mkdir /etc/docker
[root@docker ~]# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://dp0vxr93.mirror.aliyuncs.com"]
}
EOF
[root@docker ~]# systemctl daemon-reload
[root@docker ~]# systemctl enable --now docker
#测试启动
[root@docker ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
scan: Docker Scan (Docker Inc., v0.8.0)
Server:
Containers: 16
Running: 3
Paused: 0
Stopped: 13
Images: 5
Server Version: 19.03.9
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 5b46e404f6b9f661a205e28d59c982d3634148f8
runc version: v1.0.2-0-g52b36a2
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 972.3MiB
Name: docker
ID: RAN2:RN3T:UHRI:G6GF:5ZTZ:JGC5:YGXR:77IH:XWQM:7X33:TFCG:JMCW
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://dp0vxr93.mirror.aliyuncs.com/
Live Restore Enabled: false
镜像
1.什么是镜像
#主要用来启动容器的模板,镜像一般是存在镜像仓库中的。
#镜像仓库地址:https://hub.docker.com/search?type=image
#仓库分为三种:
-- 官方仓库: hub.docker.com
-- 第三方仓库: https://cr.console.aliyun.com/cn-hangzhou/instance/repositories
-- 自建仓库: hao
2.镜像的相关命令
1)搜索镜像
[root@docker ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
镜像的名称 该镜像的介绍 收藏量 官方 自建
centos The official build of CentOS. 6809 [OK]
2)下载镜像
#格式:
docker pull [仓库的URL]/[名称空间]/[仓库的名称]:[版本号]
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
#镜像名称的构成:
#docker.io /library /centos :latest
[仓库URL]/[仓库的名称空间]/[仓库的名称]:[镜像的版本号]
默认的仓库URL:docker.io
默认的仓库名称空间:library
仓库的名称:没有默认
镜像版本号:默认是latest
3)查看本地镜像列表
docker images 或者 docker image ls
image子命令主要支持如下选项:
-a : 列出所有(包括临时文件)镜像文件
--digests=true|false:列出镜像的数字摘要值
-q : 仅显示ID信息
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 5 weeks ago 231MB
REPOSITORY:[仓库URL]/[仓库的名称空间]/[仓库的名称]
TAG : 版本号
IMAGE ID : 缩写版的镜像ID
CREATED :创建该容器到现在的时间
SIZE :镜像大小
[root@docker ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 5 weeks ago 231MB
[root@docker ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 938b57d64674 3 weeks ago 448MB
nginx latest 87a94228f133 4 weeks ago 133MB
centos latest 5d0da3dc9764 8 weeks ago 231MB
[root@docker ~]# docker images --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
mysql 5.7 sha256:2db8bfd2656b51ded5d938abcded8d32ec6181a9eae8dfc7ddf87a656ef97e97 938b57d64674 3 weeks ago 448MB
nginx latest sha256:644a70516a26004c97d0d85c7fe1d0c3a67ea8ab7ddf4aff193d9f301670cf36 87a94228f133 4 weeks ago 133MB
centos latest sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 5d0da3dc9764 8 weeks ago 231MB
alvinos/php wordpress-v2 sha256:f195eeebcc33422a7792888c469cd3a19e96c1b3fd06b0c4c8b6fd25f7692009 f79487654bc0 7 months ago 785MB
alvinos/nginx wordpress-v2 sha256:d2d3b0a77e3c2a98a6dc4ffd919f05e91361fd9443d87ca1d9722097bde65188 c5aeafcf528a 7 months ago 371MB
[root@docker ~]# docker images -q
938b57d64674
87a94228f133
5d0da3dc9764
f79487654bc0
c5aeafcf528a
4)查看镜像的详情
#获取镜像的详细信息,包括PID、作者、架构等等
docker inspect [镜像名称或ID]
[root@docker ~]# docker inspect centos
[
{
"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [
"centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-15T18:20:05.184694267Z",
"Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1",
"ContainerConfig": {
"Hostname": "9bf8a9e2ddff",
"Domainname": "",
---------- -------- --------- 省略 --------- ---------- ----------- ---------
5)为镜像添加tag
#为了方便后续工作中使用特定的镜像,还可以使用docker tag命令来为本地的镜像添加标签
docker tag [原来的名称] [新名称]
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 87a94228f133 4 weeks ago 133MB
[root@docker ~]# docker tag nginx:latest nginx:1.21.1
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.21.1 87a94228f133 4 weeks ago 133MB
[root@docker ~]# docker tag nginx:1.21.1 nginx-01:1.21.1
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx-01 1.21.1 87a94228f133 4 weeks ago 133MB
nginx 1.21.1 87a94228f133 4 weeks ago 133MB
nginx latest 87a94228f133 4 weeks ago 133MB
6)上传镜像
#将镜像上传至远程仓库。
1、登录仓库
[root@docker ~]# docker login --username=zzcwep registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2、修改镜像名称
[root@docker ~]# docker tag registry.cn-hangzhou.aliyuncs.com/k8sos/centos:latest
3、上传镜像
docker push [仓库URL]/[仓库的名称空间]/[仓库的名称]:[版本号]
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/kubernetes-zzc/centos:latest
7)登陆仓库
docker login [仓库URL]
仓库URL默认是:docker.io
8)删除镜像
docker rmi [仓库的名称ID]
#参数:
-f : 强制删除镜像。
[root@docker ~]# docker rmi centos
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 87a94228f133 13 days ago 133MB
9)清理镜像
#使用一段时间之后,docker会产生很多临时文件,以及一些没有被使用的镜像, 我们可以通过
docker image prune 命令来进行清理。
#参数:
-a :删除所有无用的镜像,不光是临时镜像。
-f :强制删除镜像,而不进行提示。
10)查看镜像的历史
[root@docker ~]# docker history centos
IMAGE CREATED CREATED BY SIZE COMMENT
5d0da3dc9764 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 weeks ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
容器的使用
1)查看本机容器列表
docker ps # 查看本机容器列表
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器的ID 镜像 容器的启动命令 容器的创建时间 容器的状态 容器的端口 容器的名称
e4c4fc806516 nginx "/docker-entrypoint.…" 3 days ago Up 3 days 80/tcp nginx
STATUS:
UP : 启动状态
Exited : 停止状态
Created : 容器已经创建,当时没有启动
#参数:
-a : 查看系统上所有的容器(包含未启动)
-q : 只显示容器ID
2)创建容器
docker run # docker run是创建并启动容器
docker create # docker create是创建容器
docker create 中的参数跟 docker run 类似 主要其本身的功能不同。
-- docker run
#格式:
docker run [参数] 镜像 [启动命令]
参数和启动命令可以省略。
容器的启动流程:
1.查看本地是否存在正在使用的镜像。
2.如果本地不存在使用的镜像,则去仓库下载
3.根据镜像来启动容器
#参数:
-d : 以守护进程方式运行容器。
--name : 自定义容器的名称
-p : 指定一个端口映射
-P :随机一个端口映射
-i : 打开标准输出
-t :创建一个终端
-e :在容器内部增加一个环境变量
-h : 指定一个主机名(默认的主机名是容器的缩写版ID )
-v : 指定一个挂载卷(将宿主主机的目录挂载到容器内,从而实现文件互通)
--network : 链接一个网桥
--link : 链接一个容器
[root@docker ~]# docker run -d -it --name old -p 80:80 nginx:1.21.1 bash
48457e3ef84870380075efc935465785506904baad3010f60112d81b1aa582c4
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48457e3ef848 nginx:1.21.1 "/docker-entrypoint.…" 49 seconds ago Up 49 seconds 0.0.0.0:80->80/tcp old
3)启动容器
docker start [容器的名称|ID]
[root@docker ~]# docker start nginx
nginx
4)停止容器
docker stop [容器的名称|ID]
[root@docker ~]# docker stop nginx
nginx
5)删除容器
docker rm [容器的名称|ID]
docker rm -f [容器的ID或名称]
#案例:
删除所有容器:[root@docker ~]# docker rm -f $(docker ps -a -q)
6)查看容器详细状态
docker inspect [容器的ID或名称]
#案例:
[root@docker ~]# docker inspect nginx
[
{
"Id": "510bfd90e47641e930c16b2a069be333be9814f852b549ce0bf270e4e2f4071d",
"Created": "2021-10-25T11:21:57.638679917Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 11103,
"ExitCode": 0,
-------- ------- ----------- 省略 - - ---------------------- -------------
#要求判断指定容器是否正在运行?
[root@docker ~]# docker inspect -f '{{ .State.Running }}' 510bfd90e476
true
7)复制容器中的内容
1、将容器内的文件复制到宿主主机
docker cp [容器的ID或名称]:[文件路径] 宿主主机路径
[root@docker ~]# docker exec nginx ls /etc/nginx
conf.d
fastcgi_params
mime.types
modules
nginx.conf
scgi_params
uwsgi_params
[root@docker ~]# docker cp nginx:/etc/nginx/nginx.conf /root
[root@docker ~]# ll
total 12
-rwxrwxr-x. 1 root root 1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root 497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root 648 2021-09-07 23:38 nginx.conf
2、将宿主主机上的内容复制到容器
docker cp [宿主主机路径] [容器的ID]:[文件路径]
[root@docker ~]# docker cp /root/hostname_ip.sh nginx:/root
[root@docker ~]# docker exec nginx ls /root
hostname_ip.sh
8)进入容器
1、attach
attach是进入容器,原理是将容器内的PID为1的进程开辟一个管道,链接到宿主主机。
当在宿主主机上退出时,容器也随即退出(结束了生命周期)
2、exec(推荐)
exec其本质是在宿主主机上执行一个容器内的命令,但是加上-it参数,可以达到进入容器的效果,其原理是在容器内部新创建一个bash进程。所以当exec退出时不影响容器的正常运行。
#在宿主主机上执行一个容器内部的命令
docker exec [容器的ID或名称] [需要在容器内部执行的命令]
[root@docker ~]# docker exec nginx nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
docker exec -it [容器的名称] [进入容器执行的命令]
[root@docker ~]# docker exec -it nginx bash
root@510bfd90e476:/# ls
bin docker-entrypoint.d home media proc sbin tmp
boot docker-entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
3、nsenter
nsenter的原理是建立一个管道进程,链接到容器的内部。
nsenter --target $( docker inspect -f '{{.State.Pid }}' ) --mount --uts --ipc --net --pid
[root@docker ~]# nsenter --target $( docker inspect -f '{{.State.Pid }}' centos ) --mount --uts --ipc --net --pid
4、ssh的方式(及其不推荐)
9)使用 save 和 load保存镜像
1、保存镜像(针对点是镜像)
docker save # 将镜像保存成压缩包
#参数:
-o :输出到的文件
[root@docker ~]# docker save nginx -o image.tar
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 87a94228f133 13 days ago 133MB
centos latest 5d0da3dc9764 5 weeks ago 231MB
# docker save [镜像名称|ID] > 压缩包名称
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@docker ~]# docker save nginx > image.tar
[root@docker ~]# ll
total 134332
-rwxrwxr-x. 1 root root 1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root 497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root 137544192 2021-10-25 19:40 image.tar
#保存多个镜像
# docker save [镜像名称|ID] [镜像名称|ID] > 压缩包名称
[root@docker ~]# docker save nginx centos > docker.tar
2. 导入镜像包针对与save使用
# docker load # 将镜像包导入本地镜像中
[root@docker ~]# docker load -i docker.tar
[root@docker ~]# docker load < docker.tar
10)使用 export 和 import
1、保存容器为镜像(针对点是容器)
docker export #将容器打包成镜像
#参数:
-o :输出到的文件
[root@docker ~]# docker export 2cea8378bc86 > nginx.tar
[root@docker ~]# ll
total 132600
-rwxrwxr-x. 1 root root 1202 2021-10-12 10:03 docker-entrypoint.sh
-rw-r--r--. 1 root root 497 2021-10-09 12:06 hostname_ip.sh
-rw-r--r--. 1 root root 135770624 2021-10-25 20:06 nginx.tar
2、docker import #将镜像包导入本地镜像中
[root@docker ~]# docker import nginx.tar nginx:v1
sha256:8048cab7ea12874922dcb063b55b4525eb51e71ed36aec1df679ba0849be21c2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1 8048cab7ea12 6 seconds ago 132MB
nginx latest 87a94228f133 13 days ago 133MB
centos latest 5d0da3dc9764 5 weeks ago 231MB
11)将容器保存成本地镜像
#主要格式:docker [container id] commit [容器名称|ID]
#主要参数:
-a 作者信息
-m 提交信息
-p 提交时,暂停容器运行
docker commit
docker commit -a "ShanHe" -m "这是一个弟弟" -p nginx nginx:v2
12)查看容器的运行日志
docker logs [容器的ID或名称]
#参数:
-f : 持续监控
[root@docker ~]# docker logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2021/10/25 12:15:31 [notice] 1#1: using the "epoll" event method
2021/10/25 12:15:31 [notice] 1#1: nginx/1.21.3
2021/10/25 12:15:31 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6)
2021/10/25 12:15:31 [notice] 1#1: OS: Linux 3.10.0-1160.el7.x86_64
2021/10/25 12:15:31 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/10/25 12:15:31 [notice] 1#1: start worker processes
2021/10/25 12:15:31 [notice] 1#1: start worker process 30
13)暂停容器和重新运行容器
#容器将暂停服务
docker pause [容器名称|ID]
#重新运行容器,恢复提供和服务
docker unpause [容器名称|ID]
14)用容器搭建一个小游戏
1、代码(宿主主机)
[root@docker ~]# rz mario.zip
[root@docker ~]# mkdir /code
[root@docker ~]# mv mario.zip /code
[root@docker ~]# cd /code
[root@docker /code]# unzip mario.zip
[root@docker /code]# ll
total 148
drwxr-xr-x. 3 root root 118 2014-11-07 21:42 html5-mario
-rw-r--r--. 1 root root 148142 2021-10-22 17:02 mario.zip
2、将目录挂载到容器
- v
3、映射端口
[root@docker /code]# docker run -d --name mario -v /code/html5-mario:/usr/share/nginx/html -p 8080:80 nginx
4、浏览器浏览
10.0.0.71:8080