2. 配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ommdvdaz.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#更新并安装Docker-CE
root@localhost ~]# yum list docker-ce.x86_64 --showduplicates | sort -r
已加载插件:fastestmirror, langpacks, product-id, search-disabled-repos, subscription-
可安装的软件包
This system is not registered with an entitlement server. You can use subscription-manager to register.
: manager
Loading mirror speeds from cached hostfile
docker-ce.x86_64 3:20.10.5-3.el7 docker
docker-ce.x86_64 3:20.10.5-3.el7 docker
docker-ce.x86_64 3:19.03.13-3.el7 docker
安装指定版本的Docker-CE: (VERSION例如上面的 3:20.10.5-3.el7 )
yum -y install docker-ce-[VERSION]
yum install docker-ce.x86_64 3:20.10.5-3.el7
启动docker服务
docker version ##这个查看版本
systemctl restart docker
systemctl enable docker
从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
[root@localhost ~]# docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for docker.io/centos:latest
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。
[root@localhost ~]# docker pull mysql
Using default tag: latest
Trying to pull repository docker.io/library/mysql ...
latest: Pulling from docker.io/library/mysql
a076a628af6f: Pull complete
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
Status: Downloaded newer image for docker.io/mysql:latest
docker image ls
命令。列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest 7e7e458be53c 4 hours ago 444 MB
docker.io/centos latest 5d0da3dc9764 9 months ago 231 MB
[root@localhost ~]#
docker image ls 会输出一个完整的表格,但是我们并非所有时候都会需要这些内容。比如,刚才删除虚悬镜像的时候,我们需要利用 docker image ls 把所有的虚悬镜像的 ID 列出来,然后才可以交给 docker image rm 命令作为参数来删除指定的这些镜像,这个时候就用到了 -q 参数
[root@localhost ~]# docker image ls -q
7e7e458be53c
2e50d70ba706
ac826143758d
5d0da3dc9764
[root@localhost ~]#
下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:
[root@localhost ~]# docker image ls --format "{{.ID}}: {{.Repository}}"
7e7e458be53c: docker.io/mysql
2e50d70ba706: docker.io/redis
ac826143758d: docker.io/httpd
5d0da3dc9764: docker.io/centos
[root@localhost ~]#
或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:
[root@localhost ~]# docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
7e7e458be53c docker.io/mysql latest
2e50d70ba706 docker.io/redis latest
ac826143758d docker.io/httpd latest
5d0da3dc9764 docker.io/centos latest
[root@localhost ~]#
如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:
docker image rm [选项] <镜像1> [<镜像2> ...]
也可以用镜像的完整 ID,也称为 长 ID
,来删除镜像
[root@localhost ~]# docker image rm centos
Untagged: centos:latest
Untagged: docker.io/centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
[root@localhost ~]#
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest 7e7e458be53c 4 hours ago 444 MB
[root@localhost ~]#
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql latest 7e7e458be53c 8 hours ago 444 MB
docker.io/redis latest 2e50d70ba706 12 days ago 117 MB
docker.io/httpd latest ac826143758d 13 days ago 145 MB
docker.io/centos latest 5d0da3dc9764 9 months ago 231 MB
[root@localhost ~]# docker ps -a ##先要查容器的ID
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83f798e0afdb redis "docker-entrypoint..." 3 hours ago Exited (0) 2 hours ago stupefied_raman
83395a1da8af 2e50d70ba706 "docker-entrypoint..." 3 hours ago Exited (0) 2 hours ago sleepy_ride
b99529b23cb3 httpd "httpd-foreground" 3 hours ago Exited (0) 2 hours ago gallant_ramanujan
af40990ef858 centos "/bin/bash" 3 hours ago Exited (0) 3 hours ago relaxed_swirles
cca6bf4ab760 docker.io/centos:latest "\u00a0/bin/bash '\u00a0Hell..." 3 hours ago Created clever_wright
[root@localhost ~]# docker stop 83f798e0afdb ##然后再停止Redis服务
[root@localhost ~]# docker image rm ac826143758d ##然后再删除
我们需要删除所有仓库名为 redis 的镜像
docker image rm $(docker image ls -q redis)
所需要的命令主要为 docker run
。
[root@localhost ~]# docker run -it centos /bin/bash
[root@af40990ef858 /]#
exit表示退出容器
[root@af40990ef858 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@af40990ef858 /]# exit
exit
[root@localhost ~]#
运行mysql容器
[root@localhost ~]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
79cc3fd738d39c768b13aaf0b47d9b754d00d10614fa2f6d2c2b0af3a6177b25
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83f798e0afdb redis "docker-entrypoint..." 2 hours ago Exited (0) 2 hours ago stupefied_raman
83395a1da8af 2e50d70ba706 "docker-entrypoint..." 2 hours ago Exited (0) 2 hours ago sleepy_ride
b99529b23cb3 httpd "httpd-foreground" 2 hours ago Exited (0) 2 hours ago gallant_ramanujan
af40990ef858 centos "/bin/bash" 3 hours ago Exited (0) 3 hours ago relaxed_swirles
cca6bf4ab760 docker.io/centos:latest "\u00a0/bin/bash '\u00a0Hell..." 3 hours ago Created clever_wright
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
导出镜像:
docker commit 1df80a1bbde7 myredis #1df80a1bbde7为 redis容器ID myredis为新命名
docker save -o myredis.tar myredis
导入镜像:
docker load --input myredis.tar
[root@localhost ~]# docker commit 1df80a1bbde7 myredis
sha256:7355f0cc2e7817db471b5015c4b297732c2a922e07904382896c8594c4a48aea
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS
d385fdbefa48 mysql "docker-entrypoint.s…" 16 minutes ago Exited (1)
1df80a1bbde7 redis "docker-entrypoint.s…" 17 minutes ago Exited (0)
[root@localhost ~]# docker save -o myredis.tar myredis ##保存镜像
[root@localhost ~]#
[root@localhost ~]# ls
anaconda-ks.cfg myredis.tar
[root@localhost ~]# docker load --input myredis.tar ##将镜像压缩包导入在容器里
Loaded image: myredis:latest
[root@localhost ~]# docker images ##查看容器里有了一个myredis容器
REPOSITORY TAG IMAGE ID CREATED SIZE
myredis latest 7355f0cc2e78 3 minutes ago 113MB
redis latest 7614ae9453d1 2 months ago 113MB
mysql latest 3218b38490ce 3 months ago 516MB
centos latest 5d0da3dc9764 6 months ago 231MB
[root@localhost ~]#
从刚才的 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
Dockerfile
:这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN。
[root@localhost ~]# mkdir mynginx
[root@localhost ~]# cd mynginx
[root@localhost mynginx]# touch Dockerfile
[root@localhost mynginx]# vim Dockerfile
FROM nginx
RUN echo 'Hello, Docker!
' > /usr/share/nginx/html/index.html
[root@localhost mynginx]#
[root@localhost mynginx]# docker build -t nginx ./
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM nginx
---> 55f4b40fe486
Step 2/2 : RUN echo 'Hello, Docker!
' > /usr/share/nginx/html/index.html
---> Running in 53c3ff18b8cb
Removing intermediate container 53c3ff18b8cb
---> 3f5bc5d79efb
Successfully built 3f5bc5d79efb
Successfully tagged nginx:latest
[root@localhost mynginx]#
所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
在 Docker Hub 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有找到对应服务的镜像,官方镜像中还提供了一些更为基础的操作系统镜像,如 ubuntu、debian、centos、fedora、alpine 等,这些操作系统的软件库为我们提供了更广阔的扩展空间
RUN
指令是用来执行命令行命令的。由于命令行的强大能力,RUN
指令在定制镜像时是最常用的指令之一。其格式有两种:
shell 格式:RUN <命令>
,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN
指令就是这种格式。
exec 格式:RUN ["可执行文件", "参数1", "参数2"]
,这更像是函数调用中的格式。
从命令的输出结果中,我们可以清晰的看到镜像的构建过程。在 Step 2 中,如同我们之前所说的那样,RUN 指令启动了一个容器 9cdc27646c7b,执行了所要求的命令,并最后提交了这一层 44aa4490ce2c,随后删除了所用到的这个容器 9cdc27646c7b。
这里我们使用了 docker build 命令进行镜像构建。其格式为:
docker build [选项] <上下文路径/URL/->
在这里我们指定了最终镜像的名称 -t nginx:v3,构建成功后,我们可以像之前运行 nginx:v2 那样来运行这个镜像,其结果会和 nginx:v2 一样。
FROM centos:latest # FROM 基于哪个镜像
MAINTAINER # MAINTAINER 镜像创建者
RUN echo 'Hello, Docker!
' > /usr/share/nginx/html/index.html #RUN 安装软件用
# ADD 将文件拷贝到新产生的镜像的文件系统对应的路径。所有拷贝到新镜像中的
文件和文件夹权限为 0755,uid 和 gid 为 0
CMD echo hello world #container 启动时执行的命令或启动服务,但是一个 Dockerfile 中只能有一条 CMD 命令,