本文共 9002 字,大约阅读时间需要 30 分钟。
网址: 注册.
$ sudo docker login
$ sudo docker run -i -t ubuntu /bin/bash root@7dfcf4332617:/#
root@7dfcf4332617:/# apt-get -yqq updateroot@7dfcf4332617:/# apt-get -y install apache2
$ sudo docker commit 7dfcf4332617 hiekay/apache2
$ sudo docker images hiekay/apache2 REPOSITORY TAG IMAGE ID CREATED SIZEhiekay/apache2 latest d36fa6c04e5b About a minute ago 205MB
$ sudo docker commit -m="A new custom image" --author="hiekay" 7dfcf4332617 hiekay/apache2:webserver
解析:
-m 指定提交信息,--author指定作者信息, ID:7dfcf4332617 ,hiekay/apache2 用户名和仓库名, 标签:webserver$ sudo docker inspect hiekay/apache2:webserver [ { "Id": "sha256:dfda6a2c29aac1aa25b188f5b5f1a8b0d6cf63c92df0bacb4f062be312ebe9c2", "RepoTags": [ "hiekay/apache2:webserver" ],........
$ sudo docker run -i -t hiekay/apache2:webserver /bin/bashroot@b7a12bac939e:/#
用Dockerfile的自定义文件和docker build 命令来构建镜像.Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像.
$ mkdir static_web$ cd static_web$ touch Dockerfile
目录static_web 用来保存Dockefile ,这个目录也是我们的构建环境, Docker称此环境为上下文或者构建上下文. Docker 会在构建镜像时将构建上下文和该上下文中的文件和目录上传到Docker守护进程.
#Version: 0.0.1FROM ubuntu:18.04MAINTAINER hiekay "hikay5230@gmail.com"RUN apt-get updateRUN apt-get install -y nginxRUN echo 'Hi,I am in your container' > /usr/share/nginx/html/index.htmlEXPOSE 80
该Dockerfile由一系列指令和参数组成.
每条指令,如FROM都必须大写,后面跟一个参数.指令会按顺序从上到下执行.每条指令都会去创建一个新的镜像层并对镜像进行提交.RUN [ "apt-get", " install ", "-y", "nginx" ]
在这种方式中,使用一个数组来指定要运行的命令和传递给该命令的每个参数.
执行docker build 命令时,Dockerfile中的所有命令都会执行并提交,成功结束后返回一个新镜像.
$ cd static_web$ sudo docker build -t="hiekay/static_web" . //开始运行sending build context to Docker daemon 2.048kBStep 1/6 : FROM ubuntu:18.0418.04: Pulling from library/ubuntuDigest: sha256:29934af957c53004d7fb6340139880d23fb1952505a15d69a03af0d1418878cbStatus: Downloaded newer image for ubuntu:18.04 ---> ea4c82dcd15aStep 2/6 : MAINTAINER hiekay "hikay5230@gmail.com" ---> Running in 82ebf098abd8Removing intermediate container 82ebf098abd8 ---> b8405a62db26Step 3/6 : RUN apt-get update
其中 -t 选项设置了仓库和名称.
还可以设置标签:sudo docker build -t="hiekay/static_web:v1" .
如果不设置标签,默认标签是latest标签.
命令最后的 . 告诉Docker到本地目录去找Dockerfile , 也可以指定一个git 仓库的源地址来指定Dockerfile的地址如:sudo docker build -t="hiekay/static_web:v1" git@github.com:hiekay/docker-static-_web
在该git仓库根目录下存折Dockerfile文件.
其中:sending build context to Docker daemon 2.048kB是将构建上下文上传到Docker守护进程.假如在第四部写错了:ngin
$ cd static_web$ sudo docker build -t="hiekay/static_web" . //开始运行Sending build context to Docker daemon 2.048kBStep 1/6 : FROM ubuntu:18.04 ---> ea4c82dcd15aStep 2/6 : MAINTAINER hiekay "hikay5230@gmail.com" ---> Using cache ---> b8405a62db26Step 3/6 : RUN apt-get update ---> Using cache ---> a7b7791c3818Step 4/6 : RUN apt-get install -y ngin ---> Running in fabeeceeefe2Reading package lists...Building dependency tree...Reading state information...E: Unable to locate package nginThe command '/bin/sh -c apt-get install -y ngin' returned a non-zero code: 100
报错,E: Unable to locate package ngin
最后成功的一层ID是:a7b7791c3818$ sudo docker run -i -t a7b7791c3818 /bin/bashroot@9988a4ab2845:/# root@9988a4ab2845:/# apt-get install -y ngin
因为每一步的构建过程都会将结果提交为镜像,所以它会将之前的镜像层看做缓存.
$ sudo docker build --no-cache -t="hiekay/static_web" .
构建缓存的好处是可以实现简单的Dockerfile模板.在自己的Dockerfile文件顶部使用相同的指令模板,比如Ubuntu.
#Version: 0.0.1FROM ubuntu:18.04MAINTAINER hiekay "hikay5230@gmail.com"ENV REFRESHED_AT 2018-11-1RUN apt-get -qq update
有了这个模板,如果想刷新一个构建,只需要修改ENV指令中的日期.这使Docker在命令ENV指令时开始重置这个缓存,并运行后续指令无须依赖该缓存. 也就是说, RUN apt-get update 这条指令将会被再次执行,包缓存也将会被刷新为最新内容.
可以扩展此模板,比如适配到不同的平台或者添加额外的需求.FROM fedora:20MAINTAINER hiekay "hikay5230@gmail.com"ENV REFRESHED_AT 2018-11-1RUN yum -y -q upgrade
在Fedora中使用Yum实现了与上面的Ubuntu例子中非常类似的功能.
$ sudo docker images hiekay/static_webREPOSITORY TAG IMAGE ID CREATED SIZEhiekay/static_web latest 7e35e0a7fc62 3 hours ago 169MB
深入探究镜像是如何构建出来的,使用docker history命令
$ sudo docker history 7e35e0a7fc62 IMAGE CREATED CREATED BY SIZE COMMENT7e35e0a7fc62 3 hours ago /bin/sh -c #(nop) EXPOSE 80 0B 2f6d2e9be7ac 3 hours ago /bin/sh -c echo 'Hi,I am in your container' … 26B 4c7337c294ac 3 hours ago /bin/sh -c apt-get install -y nginx 59.7MB 489c8164d6af 3 hours ago /bin/sh -c apt-get update 23.8MB c8288775012d 3 hours ago /bin/sh -c #(nop) MAINTAINER hiekay "hikay5… 0B ea4c82dcd15a 13 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B13 days ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B 13 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B 13 days ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B 13 days ago /bin/sh -c #(nop) ADD file:bcd068f67af2788db… 85.8MB
$ sudo docker run -d -p 80 --name static_web hiekay/static_web nginx -g "daemon off;"09bb5531cbc24930ad35da95dd0acd52dd933c5996ae89e238b509053b7f8c1d
其中-p标志,用来控制Docker公开哪些网络端口给外部宿主机.
两种方法分配端口:$ sudo docker ps -l
$ sudo docker port 09bb5531cbc2 80 80/tcp -> 127.0.0.1:32768
$ sudo docker run -d -p 80:80 --name static_web hiekay/static_web nginx -g "daemon off;"
$ sudo docker run -d -p 8080:80 --name static_web hiekay/static_web nginx -g "daemon off;"
$ sudo docker run -d -p 127.0.0.1:80:80 --name static_web hiekay/static_web nginx -g "daemon off;"
绑定到了宿主机127.0.0.1这个IP的80端口上.
$ sudo docker run -d -p 127.0.0.1::80 --name static_web hiekay/static_web nginx -g "daemon off;"
其中提供参数-P 用来对外公开在Dockerfile中的EXPOSE指令中设置的所有端口
$ sudo docker run -d -P --name static_web hiekay/static_web nginx -g "daemon off;"
该命令会将容器内的80端口对本地宿主机公开,绑定宿主机的随机端口. 会将用来构建该镜像的Dockerfile文件中EXPOSE指令指定的其他端口也公开.
有了这个端口号,我们可以用本地宿主机IP或者127.0.0.1的localhost 链接到运行中的容器了.
$ curl localhost:32768//成功返回:Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.
For online documentation and support please refer tonginx.org.
Commercial support is available atnginx.com.Thank you for using nginx.
$ sudo docker push hiekay/static_webThe push refers to repository [docker.io/hiekay/static_web]......
成功后,可以在Docker Hub上看到我们上传的镜像.
sudo docker rmi hiekay/static_web
如果要删除一个Docker Hub上的镜像仓库,需要登录Docker Hub后使用Delete repository链接来删除.
sudo docker rmi 'docker images -a -q'
sudo docker run -p 5000:5000 registry
sudo docker images hiekay/static_web
sudo docker tag 某个ID docker.example.com:5000/hiekay/static_web
sudo docker push docker.example.com:5000/hiekay/static_web
sudo docker run -t -i docker.example.com:5000/hiekay/static_web /bin/bash
转载地址:http://nuuta.baihongyu.com/