#Docker镜像制作

1. 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce

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

CentOS 7(使用 yum 进行安装)

#安装必要的一些系统工具
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

 查找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 就是运行容器的命令,

所需要的命令主要为 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

   docker ps -a  显示所有的容器,包括未运行的 (CONTAINER ID :为容器ID)

[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  (定制镜像容器方法一)

导出镜像:
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 ~]# 

使用 Dockerfile 定制镜像 (方法二)


       从刚才的 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]#

FROM 指定基础镜像


所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 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 指令是用来执行命令行命令的。由于命令行的强大能力,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 命令,

你可能感兴趣的:(Docker,docker,容器,centos,运维)