Docker学习笔记(二) 使用Docker镜像和仓库

11.2记

 

列出镜像:
sudo docker images : 查看主机可用镜像

 

拉取镜像:

sudo docker pull fedora : 拉取fedora系列镜像到本地

sudo docker pull fedora:20 : 只拉取指定标签的镜像(fedora:20)

sudo docker images fedora : 查看fedora镜像的内容

 

查找镜像:

sudo docker search puppet: 查找所有带有puppet的镜像

 

构建镜像:

  • 使用docker commit命令
  • 使用docker build命令 和 Dockerfile文件

 

 

用commit方式步骤:

先在docker hub创建账号

然后登录:sudo docker login

 

1.创建一个容器并打开shell

sudo docker run -i -t ubuntu /bin/bash

 

2.下载apache2

apt-get update

apt-get install apache2

 

3.sudo docker commit 4aab3ce3cb76(容器ID) erliccao/apache2

或者:sudo docker commit -m="A new custon image" --author="erliccao" 90cf5e70ccb5 erliccao/apache2:webserver

-m添加提交信息, --author指定作者    :webserver添加标签

 

4.sudo docker inspect erliccao/apache2:webserver 查看提交的镜像

 

5.用构建的镜像创建容器

sudo docker run -i -t  erliccao/apache2:webserver /bin/bash

 

 

用Dockerfile构建镜像(推荐)

创建一个static_web目录用来保存Dockerfile,这个目录就是构建环境,Docker则称此环境为上下文或者构建上下文。

Dockerfile:

# Verision: 0.0.1
# 指定基础镜像
FROM ubuntu:latest
# 指定作者
MAINTAINER Erlic Cao "[email protected]"
# 执行指令
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in your container' /usr/share/nginx/html/index.html 
# 指定容器内的应用程序使用容器的指定端口
EXPOSE 80

 

sudo docker build -t="erliccao/static_web"  .

根据Dockerfile构建镜像

-t指定仓库和镜像名

.告诉Docker到本地目录中找Dockerfile文件。 也可以添加一个标签,如"erliccao/static_web:v1"

 

指令失败会怎样?

如果执行中因为把nginx拼成ngin而安装nginx失败了,这时候需要调试一下这次失败。我们可以用docker run命令来基于这次构建到目前已经成功的最后一步创建一个容器,然后调试找出哪里出错。 解决问题后退出容器,使用正确的包名来修改Dockerfile文件,之后再尝试构建。

 

 Dockerfile指令

除了上述的RUN和EXPOSE命令,Dockerfile中还有很多其它指令。

1.CMD

CMD指令用于指定一个容器启动时要运行的命令。区别于RUN指令,RUN是指定镜像构建时要运行的指令,CMD是指定容器启动时要运行的命令,这和docker run命令指定启动容器运行的命令类似。

例如:CMD ["/bin/bash"] = sudo docker run -i -t erliccao/static_web /bin/bash

 

注意:使用docker run命令可以覆盖CMD指令。如果在Dockfile中指定了CMD,同时在docker run命令行中也指定了要运行命令,docker run会覆盖CMD指令。

 

2.ENTRYPOINT

ENTRYPOINT和CMD类似,只是ENTRYPOINT在启动容器时不会被覆盖。实际上docker run中指定的任何参数都会被当作参数再次传递给ENTRYPOINT指令中的命令。

例如设置:ENTRYPOINT ["/usr/sbin/nginx"]

构建新镜像:sudo dcoker build -t="erliccao/static_web" 

启动一个容器:sudo docker run -t -i erliccao/static_web  -g "daemon off;"

-g "daemon off;"参数会传递给/usr/sbin/nginx 相当于  /usr/sbin/nginx  -g "daemon off;"

该命令会以前台运行的方式启动Nginx守护进程。

 

3.WORKDIR

WORKDIR指令用来从镜像中创建一个新容器时,在内部设置一个工作目录。ENTRYPOINT或CMD指定的程序会在此目录下执行

 

4.ENV

ENV指令用来在镜像构建过程中设置环境变量。

ENV TARGET_DIR  /home/app

WORKDIR $TARGET_DIR   : WORKDIR被指定为/home/app

这些环境变量会持久保存到我们的镜像创建的任何容器中。

 

5.USER

USER指令用来指定该镜像会以什么用户来运行。

USER nginx:基于该镜像启动的容器会以nginx用户的身份来运行。可以指定用户名或以及组或GID

例如:USER user:group  ;   USER uid:gid;  USER uid:group

 

6.VOLUME

VOLUME指令用来向基于镜像创建的容器添加卷。一个卷可以存在与一个或者多个容器内特定的目录

 

7.ADD

ADD指令用来将构建环境下的文件和目录复制到镜像中。

ADD software.lic /opt/application/software.lic

这里会将构建目录下的software.lic复制到镜像的/opt/application目录下。指向源文件的位置参数可以是一个URL,或者构建上下文或环境中文件名或目录。

URL格式:

ADD http://wordpress.org/latest.zip  /root/wordpress.zip

 

8.COPY

COPY指令类似于ADD,COPY指令只关心在构建上下文中复制本地文件,而不会去做文件提取和解压工作

 

9.ONBUILD

ONBUILD指令能为镜像添加触发器(trigger)。当一个镜像被用作其它镜像的基础镜像时,该镜像中的触发器将会被执行。

例如:

ONBUILD ADD .   /app/src

ONBUILD RUN cd /app/src && make

上面的触发器会在创建镜像时把构建上下文复制到/app/src目录,并且执行切换到该目录并make的指令

 

 

将镜像推送到Docker Hub

可以通过docker push命令将本地镜像erliccao/apache2推送到Docker Hub。

sudo docker push erliccao/apache2

 

 

删除镜像:

sudo docker rmi erliccao/apache2

 

运行自己的Docker Registry

有时我们希望构建和存储包含不想被公开的信息或数据的镜像。有两种选择:

利用Docker Hub上的私有仓库

在防火墙后面运行自己的Registry

从容器运行Registry

sudo docker run -p 5000:5000 registry

该命令会启动一个运行Registry应用的容器,并绑定到本地宿主机的5000端口上。

 

将本地镜像上传到我们的新Registry上

首先查看镜像的ID:sudo docker images erliccao/apache2

接着使用Registry为该镜像打上标签,需要在镜像名前加上主机名和端口前缀。在这个例子中Registry主机名为:docker.example.com

sudo docker tag 5b5e4d6e344d docker.example.com:5000/erliccao/apache2

 

打完标签后,就能通过docker push 命令将它推送到新的Registry中:

sudo docker push docker.example.com:5000/erliccao/apache2

这个镜像就被提交到了本地的Registry中,并且可以将其用于使用docker run命令构建新容器:

sudo docker run -t -i docker.example.com:5000/erliccao/apache2  /bin/bash

 

 

 

 

 

 

 

 

 

 

 

 

      

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Docker学习笔记,Docker)