docker镜像管理和dockerfile详解(8)
docker镜像加速
docker-io
先到 https://cr.console.aliyun.com/ 注册一下,登录成功后,在控制台,看左侧,有一个加速器按钮,点开找到自己的专属加速链接,我的是 https://olxmv577.mirror.aliyuncs.com (hotlight2010 https://45colej5.mirror.aliyuncs.com 我的) 然后vi /etc/sysconfig/docker 最下面增加一行: other_args="--registry-mirror=https://olxmv577.mirror.aliyuncs.com" #centos6用这个 other_args="--registry-mirror=http://db411c61.m.daocloud.io" #centos7用这个 然后就是重启一下docker就ok了,测试发现速度杠杠的。
docker1.13
1.方法1
在 daocloud.io 免费注册一个用户。
帐号:xgmxgmxm 密码:xxxxxxx(与邮箱密码一样) 邮箱:xgmxgmxm@163.com
登录后,点击顶部菜单“加速器”
copy “加速器”命令并在 host 中执行(你的命令可能跟我的会稍有不同)。
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://db411c61.m.daocloud.io #执行这个
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件 /etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同
2.方法2
/etc/sysconfig/docker
更改OPTIONS的内容设置为:
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
OPTIONS='--selinux-enabled=false --insecure-registry daocloud.io'
docker镜像常用命令
docker images //查看本地都有哪些镜像 docker tag centos aming123:123456(tag名) // 创建镜像 基于centos镜像 docker search (image-name) //从docker仓库搜索docker镜像后面是关键词 docker rmi centos //用来删除指定镜像 docker pull centos //下载镜像 docker commit -m "install httpd" -a "Aming" 2c74d574293f aming/centos #创建镜像基于容器-m 描述 -a 作者 docker-id 镜像名 docker export container_id > file.tar // 导出容器可以迁移到其他机器上需要导入 cat centos-5-x86.tar.gz |docker import - centos-5-x86 #本地模块导入 cat file.tar |docker import - aming_test //这样会生成aming_test的镜像 docker history a6c10b1a3c7c #查看dockerfile创建的镜像的执行过程。 a6c10b1a3c7c是镜像Id
镜像下载地址
镜像下载地址 https://hub.docker.com/u/kubeguide/ https://hub.daocloud.io https://hub.docker.com/ https://dev.aliyun.com/search.html
https://hub.tenxcloud.com/search?q=jimmy&source=tenxcloud #时速云
dockerfile创建镜像
Dockerfile 分为四部分: 基础镜像信息、维护者信息、镜像操作指令、容器启动时执行命令。 Dockerfile语法 1. FROM 格式 FROM 或者 FROM : 比如 FROM centos FROM centos:latest 2. MAINTAINER 格式 MAINTAIN 比如 MAINTAINER aming aming@aminglinux.com 3. RUN 格式为 RUN 或者 RUN ["executable", "param1", "param2"] 比如 RUN yum install httpd RUN ["/bin/bash", "-c", "echo hello"] 4. CMD 三种格式: CMD ["executable", "param1", "param2"] CMD command param1 param2 CMD ["param1", "param2"] RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。比如 CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"] 5. EXPOSE 格式为 EXPOSE [...] 比如 EXPOSE 22 80 8443 这个用来指定要映射出去的端口,比如容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。 6. ENV 格式 ENV 比如 ENV PATH /usr/local/mysql/bin:$PATH 它主要是为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量 ENV MYSQL_version 5.6
例子:
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
7. ADD 格式 add 将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。比如 ADD /local/nginx/conf / [如果 src 是归档文件(tar, zip, tgz, xz 等),文件会被自动解压到 dest] 8. COPY 格式同add
COPY src dest 使用方法和add一样,不同的是,它不支持url
需要注意: src路径是以Dockerfile为相对路径的 dest 目录不存在会被创建,但是/aaa这样的目录是创建不了的。/home/aaa 这是可以被创建的 9. ENTRYPOINT 格式类似CMD 表示容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是: CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。比如,容器名字为aming CMD [“/bin/echo”, “test ”] 而我们启动容器的命令是 docker run aming 这样会输出 test 假如启动容器的命令是 docker run -it aming /bin/bash 什么都不会输出 ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行 ENTRYPOINT ["echo", "test"] docker run -it aming 123 则会输入 test 123 ,这相当于要执行命令 echo test 123
10.WORKDIR
为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
如果 WORKDIR 不存在,Docker 会自动为我们创建。
例子:
WORKDIR /data
11.VOLUME /var/lib/mysql
相当于 docker run -tid -v /var/lib/mysql #数据存在host 容器删掉不影响数据。VOLUME
的作用与-v
等效 Dockerfile 示例:(搭建nginx镜像) 先下载nginx的配置文件 wget http://www.apelearn.com/study_v2/.nginx_conf vim Dockerfile //内容如下 ############################################################ # Dockerfile to build Nginx Installed Containers # Based on CentOS ############################################################ # Set the base image to CentOS FROM centos # File Author / Maintainer MAINTAINER aming aming@aminglinux.com # Install necessary tools RUN yum install -y pcre-devel wget net-tools gcc RUN yum install -y zlib zlib-devel make RUN yum install -y openssl-devel # Install Nginx ADD http://nginx.org/download/nginx-1.8.0.tar.gz . RUN tar zxvf nginx-1.8.0.tar.gz RUN mkdir -p /usr/local/nginx RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install RUN rm -fv /usr/local/nginx/conf/nginx.conf COPY .nginx_conf /usr/local/nginx/conf/nginx.conf # Expose ports EXPOSE 80 # Set the default command to execute # when creating a new container CMD /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf && tail -f #有cmd命令的 docker run -tid xgm_mysql ,需要加-ti参数才能启动 创建镜像: docker build -t centos_nginx .
如果执行 docker build 时没有指定 tag,会使用默认值 latest。其效果相当于:
docker build -t ubuntu-with-vi:latest .
docker images 可以看到我们新建的镜像 #启动镜像和服务注意: docker run -tid d32f /bin/bash -c "/usr/local/nginx/sbin/nginx && tail -f" 像启动nginx. 因为nginx是后台的服务。docker默认认为没有启动,所以docker会自杀掉,导致容器启动不起来。
RUN、CMD 和 ENTRYPOINT
简单的说: 1.RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。 2.CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换。 3.ENTRYPOINT 配置容器启动时运行的命令。 下面我们详细分析。 Shell 和 Exec 格式 我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式,二者在使用上有细微的区别。 Shell 格式 <instruction> <command> 例如: RUN apt-get install python3 CMD echo "Hello world" ENTRYPOINT echo "Hello world" 当指令执行时,shell 格式底层会调用 /bin/sh -c <command> 。 例如下面的 Dockerfile 片段: ENV name Cloud Man ENTRYPOINT echo "Hello, $name" 执行 docker run <image> 将输出: Hello, Cloud Man 注意环境变量 name 已经被值 Cloud Man 替换。 下面来看 Exec 格式。 Exec 格式 <instruction> ["executable", "param1", "param2", ...] 例如: RUN ["apt-get", "install", "python3"] CMD ["/bin/echo", "Hello world"] ENTRYPOINT ["/bin/echo", "Hello world"] 当指令执行时,会直接调用 <command>,不会被 shell 解析。 例如下面的 Dockerfile 片段: ENV name Cloud Man ENTRYPOINT ["/bin/echo", "Hello, $name"] 运行容器将输出: Hello, $name 注意环境变量“name”没有被替换。 如果希望使用环境变量,照如下修改 ENV name Cloud Man ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $name"] 运行容器将输出: Hello, Cloud Man CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。 RUN RUN 指令通常用于安装应用和软件包。 RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。 RUN 有两种格式: 1. Shell 格式:RUN 2. Exec 格式:RUN ["executable", "param1", "param2"] 下面是使用 RUN 安装多个包的例子: RUN apt-get update && apt-get install -y \ bzr \ cvs \ git \ mercurial \ subversion 注意:apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。 CMD CMD 指令允许用户指定容器的默认执行的命令。 此命令会在容器启动且 docker run 没有指定其他命令时运行。 1. 如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。 2. 如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。 CMD 有三种格式: 1. Exec 格式:CMD ["executable","param1","param2"] 这是 CMD 的推荐格式。 2. CMD ["param1","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。 3. Shell 格式:CMD command param1 param2 Exec 和 Shell 格式前面已经介绍过了。 第二种格式 CMD ["param1","param2"] 要与 Exec 格式 的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。我们将在后面讨论 ENTRYPOINT 时举例说明。 下面看看 CMD 是如何工作的。Dockerfile 片段如下: CMD echo "Hello world" 运行容器 docker run -it [image] 将输出: Hello world 但当后面加上一个命令,比如 docker run -it [image] /bin/bash,CMD 会被忽略掉,命令 bash 将被执行: root@10a32dc7d3d3:/# ENTRYPOINT ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。 ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。 ENTRYPOINT 有两种格式: 1. Exec 格式:ENTRYPOINT ["executable", "param1", "param2"] 这是 ENTRYPOINT 的推荐格式。 2. Shell 格式:ENTRYPOINT command param1 param2 在为 ENTRYPOINT 选择格式时必须小心,因为这两种格式的效果差别很大。 Exec 格式 ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。 ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。 比如下面的 Dockerfile 片段: ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"] 当容器通过 docker run -it [image] 启动时,输出为: Hello world 而如果通过 docker run -it [image] CloudMan 启动,则输出为: Hello CloudMan Shell 格式 ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。 最佳实践 1. 使用 RUN 指令安装应用和软件包,构建镜像。 2. 如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。 3. 如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。 到这里,我们已经具备编写 Dockerfile 的能力了。如果大家还觉得没把握,推荐一个快速掌握 Dockerfile 的方法:去 Docker Hub 上参考那些官方镜像的 Dockerfile。