参考链接:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.1ec41b11RJ4PKS
#step 1:安装安装必要的一些系统工具
[root@node1 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
[root@node1 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
[root@node1 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
[root@node1 ~]# yum makecache fast
#安装的是默认最新版本
[root@node1 ~]# yum install docker-ce -y
# Step 5: 开启Docker服务
#配置docker镜像加速
[root@node1 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl start docker
[root@node1 ~]# docker info
Registry Mirrors:
https://registry.docker-cn.com/
出现该内容表示镜像加速配置成功
如果显示如下内容:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@node1 ~]# vim /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
#从配置文件/etc/sysctl.conf加载内核参数设置
[root@localhost ~]# sysctl -p
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,您可以通过以下方式开启。同理可以开启各种测试版本等。
# 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]
[root@node1 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 18885 [OK]
unit Official build of NGINX Unit: Universal Web … 8 [OK]
nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 111
nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 76
nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 33
nginx/unit NGINX Unit is a dynamic web and application … 64
nginxinc/nginx-s3-gateway Authenticating and caching gateway based on … 1
nginx/nginx-ingress-operator NGINX Ingress Operator for NGINX and NGINX P… 0
nginxinc/amplify-agent NGINX Amplify Agent docker repository 1
nginx/nginx-quic-qns NGINX QUIC interop 1
nginxinc/ingress-demo Ingress Demo 4
nginxproxy/nginx-proxy Automated Nginx reverse proxy for docker con… 101
nginxproxy/acme-companion Automated ACME SSL certificate generation fo… 122
bitnami/nginx Bitnami nginx Docker Image 171 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 29 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 97
nginxinc/nginmesh_proxy_debug 0
nginxproxy/docker-gen Generate files from docker container meta-da… 12
nginxinc/mra-fakes3 0
kasmweb/nginx An Nginx image based off nginx:alpine and in… 6
rancher/nginx-ingress-controller 11
nginxinc/ngx-rust-tool 0
nginxinc/mra_python_base 0
nginxinc/nginmesh_proxy_init 0
rancher/nginx-ingress-controller-defaultbackend 2
参数 | 说明 |
---|---|
NAME | 镜像名称 |
DESCRIPTION | 镜像说明 |
STARS | 点赞数量 |
OFFICIAL | 是否是docker官方发布的 |
AUTOMATED | 是否是自动构建的 |
Docker Hub上有大量的高质量的镜像可以用。从Docker镜像仓库获取镜像的命令是docker pull,其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
docker镜像仓库地址:地址的格式一般是<域名/IP>:[端口号],默认地址是Docker Hub。
仓库名:仓库名是两段式名称,即<用户名>/<软件名>。对于Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
一个仓库会包含同一个软件不同版本的镜像, 而标签就常用于对应该软件的各个版本。
根据镜像名称(tag指定版本)拉取镜像
#alpine 版本:构建容器小镜像的发型版本
[root@node1 ~]# docker pull nginx:1.14-alpine
1.14-alpine: Pulling from library/nginx
bdf0201b3a05: Pull complete
3d0a573c81ed: Pull complete
8129faeb2eb6: Pull complete
3dc99f571daf: Pull complete
Digest: sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
Status: Downloaded newer image for nginx:1.14-alpine
docker.io/library/nginx:1.14-alpine
#标记本地镜像,将其归入某一仓库
[root@node1 ~]# docker tag nginx:1.14-alpine test/nginx:v1
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 4 years ago 16MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
#查看镜像的层数
[root@node1 ~]# docker history nginx:1.14-alpine
IMAGE CREATED CREATED BY SIZE COMMENT
8a2fb25a19f5 4 years ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 4 years ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 4 years ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 4 years ago /bin/sh -c #(nop) COPY file:ebf4f0eb33621cc0… 1.09kB
<missing> 4 years ago /bin/sh -c #(nop) COPY file:4c82b9f10b84c567… 643B
<missing> 4 years ago /bin/sh -c GPG_KEYS=B0F4253373F8F6F510D42178… 10.5MB
<missing> 4 years ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2 0B
<missing> 4 years ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 4 years ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 4 years ago /bin/sh -c #(nop) ADD file:2e3a37883f56a4a27… 5.53MB
#从下载过程中可以看到镜像是由多层存储所构成,下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的ID的前12位。并且下载结束后,给出该镜像完整的sha256的摘要,以确保下载一致性。
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 4 years ago 16MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
#列表包含了仓库名、标签、镜像ID、创建时间以及所占用的空间。
#其中镜像ID则是镜像的唯一标识,一个镜像可以对应多个标签。
[root@node1 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 4 years ago 16MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
[root@node1 ~]# docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.14-alpine 8a2fb25a19f5 4 years ago 16MB
(1)如果查看镜像的显示结果中出现了没有仓库名,也没有标签,均为的镜像,可能是因为旧的镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了。除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。 由于新旧镜像同名, 旧镜像名称被取消,从而出现仓库名、 标签均为 的镜像。 这类无标签镜像也被称为虚悬镜像 (dangling image) , 可以用下面的命令专门显示这类镜像:
[root@node1 ~]# docker image ls -f dangling=true
一般来说, 虚悬镜像已经失去了存在的价值, 是可以随意删除的, 可以用下面的命令删除。
[root@node1 ~]# docker image prune
(2)为了加速镜像构建、 重复利用资源, Docker 会利用中间层镜像。 所以在使用一段时间后, 可能会看到一些依赖的中间层镜像。 默认的 docker image ls 列表中只会显示顶层镜像, 如果希望显示包括中间层镜像在内的所有镜像的话, 需要加 -a 参数。
[root@node1 ~]# docker image ls -a
[root@node1 ~]# docker image save nginx > docker-nginx.tar.gz
[root@node1 ~]# ls docker-nginx.tar.gz
docker-nginx.tar.gz
[root@node1 ~]# docker pull ubuntu:latest
[root@node1 ~]# docker image save -o ./ubuntu_nginx.tar.gz ubuntu:latest nginx:1.14-alpine
[root@node1 ~]# ls
anaconda-ks.cfg docker-nginx.tar.gz ubuntu_nginx.tar.gz
注:
#-o:指定导出镜像的位置;
#可以同时导出多个镜像为一个文件;
#指定.tar.gz 可以导出并压缩。
[root@node1 ~]# docker image rm nginx:1.14-alpine
Untagged: nginx:1.14-alpine
Untagged: nginx@sha256:485b610fefec7ff6c463ced9623314a04ed67e3945b9c08d7e53a47f6d108dc7
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 01f29b872827 13 days ago 77.8MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
#也可以使用ID删除镜像
[root@node1 ~]# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 01f29b872827 13 days ago 77.8MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
[root@node1 ~]# docker image rm 01f
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:ec050c32e4a6085b423d36ecd025c0d3ff00c38ab93a3d71a460ff1c44fa6d77
Deleted: sha256:01f29b872827fa6f9aed0ea0b2ede53aea4ad9d66c7920e81a8db6d1fd9ab7f9
Deleted: sha256:bce45ce613d34bff6a3404a4c2d56a5f72640f804c3d0bd67e2cf0bf97cb950c
#查看
[root@node1 ~]# docker image ls -a
REPOSITORY TAG IMAGE ID CREATED SIZE
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
[root@node1 ~]# docker image load -i ubuntu_nginx.tar.gz
bce45ce613d3: Loading layer [==================================================>] 80.35MB/80.35MB
Loaded image: ubuntu:latest
Loaded image: nginx:1.14-alpine
[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 01f29b872827 13 days ago 77.8MB
nginx 1.14-alpine 8a2fb25a19f5 4 years ago 16MB
test/nginx v1 8a2fb25a19f5 4 years ago 16MB
[root@node1 ~]# docker image inspect ubuntu
docker run 镜像名
(1)格式
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
(2)options 常用命令选项
-t :打开一个终端,像使用交换机一样使用容器
-i:交互式访问
–name:容器名字
–network:指定网络
–rm:容器一停,自动删除
-d:后台运行容器,返回容器ID;否则会一直占据着终端
-p:端口映射,将容器内服务的端口映射在宿主机的指定端口,格式为:主机(宿主)端口:容器端口
-P: 随机端口映射,容器内部端口随机映射到主机的端口
(3)运行容器
[root@node1 ~]# docker run --name web1 -d -p 8888:80 nginx:1.14-alpine
6a0745591dae815edcda2a42832f00b9040e72ecaec3ff0680f7bdb18621e09a
#查询docker端口映射
[root@node1 ~]# docker port web1
80/tcp -> 0.0.0.0:8888
80/tcp -> [::]:8888
#在运行容器时,交互式进入容器
[root@node1 ~]# docker run --name ubuntu1 -it ubuntu /bin/bash
root@e41a01e5d3a7:/# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
root@e41a01e5d3a7:/# exit #退出
(4)查询容器运行状态命令 docker ps
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a0745591dae nginx:1.14-alpine "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
#-a查询所有的容器,包括未运行的容器
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e41a01e5d3a7 ubuntu "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago ubuntu1
6a0745591dae nginx:1.14-alpine "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
#注:容器内的第一个进程必须一直处于运行的状态,否则这个容器,就会处于退出状态!
docker stop 关闭运行的容器
docker kill 杀死运行的容器
-s:指定信号,和kill 用法一样;-9 强制停止容器
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a0745591dae nginx:1.14-alpine "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@node1 ~]# docker kill web1
web1
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker start/restart
格式
docker start [OPTIONS] CONTAINER [CONTAINER…]
Options
-a:附加到当前终端
-i:交互式
[root@node1 ~]# docker start web1
web1
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a0745591dae nginx:1.14-alpine "nginx -g 'daemon of…" 8 minutes ago Up 4 seconds 0.0.0.0:8888->80/tcp, :::8888->80/tcp web1
[root@node1 ~]# docker inspect web1 | grep -i address
"LinkLocalIPv6Address": "",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"GlobalIPv6Address": "",
"IPAddress": "172.17.0.2",
"MacAddress": "02:42:ac:11:00:02",
"IPAddress": "172.17.0.2",
"GlobalIPv6Address": "",
"MacAddress": "02:42:ac:11:00:02",
[root@node1 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
docker exec 或者 docker container exec
格式
docker exec [OPTIONS] CONTAINER COMMAND [ARG…]
options 选项
-d:在后台运行命令
-e:设置环境变量
-i:交互式
-t:打开一个终端
[root@node1 ~]# docker run --name web1 -d nginx:1.14-alpine
27d9def6c05bc9a90e2d55d965b7203d4bfc4553b6f3fff027fe5efb4c89fac6
[root@node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27d9def6c05b nginx:1.14-alpine "nginx -g 'daemon of…" 19 seconds ago Up 19 seconds 80/tcp web1
[root@node1 ~]# docker exec -it web1 /bin/sh
/ # ls /
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
/ # exit
[root@node1 ~]# docker exec web1 ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
12: eth0@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@node1 ~]# docker kill web1
web1
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27d9def6c05b nginx:1.14-alpine "nginx -g 'daemon of…" 2 minutes ago Exited (137) 4 seconds ago web1
d48ee683c80e eea7b3dcba7e "/docker-entrypoint.…" 4 minutes ago Exited (0) About a minute ago web2
e41a01e5d3a7 ubuntu "/bin/bash" 18 minutes ago Exited (0) 18 minutes ago ubuntu1
[root@node1 ~]# docker rm web1
web1
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d48ee683c80e eea7b3dcba7e "/docker-entrypoint.…" 5 minutes ago Exited (0) About a minute ago web2
e41a01e5d3a7 ubuntu "/bin/bash" 18 minutes ago Exited (0) 18 minutes ago ubuntu1
#删除所有容器,-f强制删除
[root@node1 ~]# docker rm -f `docker ps -a -q`
d48ee683c80e
e41a01e5d3a7
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#删除所有处于终止状态的容器
[root@localhost ~]# docker container prune
数据卷是一个可供一个或多个容器使用的特殊目录, 它绕过 UFS, 可以提供很多有用的特性:
注意: 数据卷的使用, 类似于 Linux 下对目录或文件进行 mount, 镜像中的被指定为挂载点的目录中
的文件会隐藏掉, 能显示看到的是挂载的数据卷 。
1、创建一个数据卷
[root@node1 ~]# docker volume create my-vol
my-vol
[root@node1 ~]# docker volume ls
DRIVER VOLUME NAME
local my-vol
2、查看指定数据卷的信息:
[root@node1 ~]# docker volume inspect my-vol
[
{
"CreatedAt": "2023-08-18T08:23:53+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": null,
"Scope": "local"
}
]
3、启动一个挂载数据卷的容器:
#在用 docker run 命令的时候, 使用 -v 标记来将数据卷挂载到容器里。 在一次 docker run 中可以挂载多个数据卷。
#下面创建一个名为 web 的容器, 并加载一个数据卷到容器的 /usr/share/nginx/html/ 目录。
[root@node1 ~]# docker run -d -P --name web -v my-vol:/usr/share/nginx/html nginx:1.14-alpine
b5f7c39c110079781f2833554e0f2383c6bdb4654e59948f6e095b75a42dcd1a
[root@node1 ~]# docker inspect web
[root@node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5f7c39c1100 nginx:1.14-alpine "nginx -g 'daemon of…" 53 seconds ago Up 52 seconds 0.0.0.0:32768->80/tcp, :::32768->80/tcp web
[root@node1 ~]# docker volume rm my-vol
Error response from daemon: remove my-vol: volume is in use - [b5f7c39c110079781f2833554e0f2383c6bdb4654e59948f6e095b75a42dcd1a]
[root@node1 ~]# docker rm -f web
web
[root@node1 ~]# docker volume rm my-vol
my-vol
#数据卷是被设计用来持久化数据的, 它的生命周期独立于容器, Docker不会在容器被删除后自动删除数据卷, 并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。 如果需要在删除容器的同时移除数据卷。 可以在删除容器的时候使用 docker rm -v 这个命令。
#无主的数据卷可能会占据很多空间, 要清理请使用以下命令:
[root@node1 ~]# docker volume prune
#查看镜像、容器、数据卷所占用的空间
[root@node1 ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 3 0 280.5MB 280.5MB (100%)
Containers 0 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B