Docker镜像使用与创建 使用维护



Docker镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

docker images  # 列出本地主机上的镜像。
docker pull ubuntu:13.10  # 获取一个新的镜像
docker search httpd  # 查找镜像
docker pull httpd    # 拖取镜像
docker run httpd     # 下载完成后,我们就可以使用这个镜像了。

各个选项说明:

  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        4 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
training/webapp     latest              6fae60ef3446        11 months ago       348.8 MB

要使用版本为15.10的ubuntu系统镜像来运行容器时,命令: docker run -t -i ubuntu:15.10 /bin/bash 

要使用版本为14.04的ubuntu系统镜像来运行容器时,命令: docker run -t -i ubuntu:14.04 /bin/bash

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。


Docker创建镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#

在运行的容器内使用 apt-get update 命令进行更新。

在完成操作之后,输入 exit命令来退出这个容器。

此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2  # 提交容器副本

各个参数说明:

  • -m:提交的描述信息

  • -a:指定镜像作者

  • e218edb10161:容器ID

  • runoob/ubuntu:v2:指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 runoob/ubuntu:v2

docker run -t -i runoob/ubuntu:v2 /bin/bash   # 使用我们的新镜像 runoob/ubuntu 来启动一个容器


Docker构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"
RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源

RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。

然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

runoob@runoob:~$ docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---> d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
 ---> Using cache
 ---> 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---> Using cache
 ---> 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

参数说明:

  • -t :指定要创建的目标镜像名

  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

我们可以使用新的镜像来创建容器

runoob@runoob:~$ docker run -t -i runoob/centos:6.7  /bin/bash[root@41c28d18b5fb /]# id runoob
uid=500(runoob) gid=500(runoob) groups=500(runoob)

从上面看到新镜像已经包含我们创建的用户runoob


我们可以使用 docker tag 命令,为镜像添加一个新的标签。# 设置镜像标签

docker tag 860c279d2fec runoob/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。


Docker 容器连接

端口映射并不是唯一把 docker 连接到另一个容器的方法。

docker有一个连接系统允许将多个容器连接在一起,共享连接信息。

docker连接会创建一个父子关系,其中父容器可以看到子容器的信息。

1. 通过docker ps 命令可以查看到容器的端口映射.

2. 使用 docker port 可以查看指定 (ID或者名字)容器的某个确定端口映射到宿主机的端口号.

   可以使用docker port 7a38a1ad55c6 或docker port determined_swanson来查看容器端口的映射情况.  

  • -P :是容器内部端口随机映射到主机的高端口。
  • -p : 是容器内部端口绑定到指定的主机端口。

3. docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py # 可以通过访问127.0.0.1:5001来访问容器的5000端口

4. docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 

默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp

docker port adoring_stonebraker 5000  # docker port 命令可以让我们快捷地查看端口的绑定情况:  127.0.0.1:5001

docker run -d -P --name runoob training/webapp python app.py  
# 当我们创建一个容器的时候,docker会自动对它进行命名。另外,我们也可以使用--name标识来命名容器
# docker ps 命令来查看容器名称: 0.0.0.0:32769->5000/tcp   runoob

Docker 安装

使用apache镜像

运行容器

docker run -p 80:80 -v $PWD/www/:/usr/local/apache2/htdocs/ -v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf -v $PWD/logs/:/usr/local/apache2/logs/ -d httpd

命令说明:

-p 80:80 :将容器的80端口映射到主机的80端口

-v $PWD/www/:/usr/local/apache2/htdocs/ :将主机中当前目录下的www目录挂载到容器的/usr/local/apache2/htdocs/

-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf :将主机中当前目录下的conf/httpd.conf文件挂载到容器的/usr/local/apache2/conf/httpd.conf

-v $PWD/logs/:/usr/local/apache2/logs/ :将主机中当前目录下的logs目录挂载到容器的/usr/local/apache2/logs/


使用UI For Docker Web界面管理Docker:

ui-for-docker项目托管在github,https://github.com/kevana/ui-for-docker。安装非常简单,就一个命令:

docker run -d -p 9000:9000 --privileged -v /var/run/docker.sock:/var/run/docker.sock uifd/ui-for-docker

完成后你就可以打开浏览器输入http://[你的主机IP]:9000来打开docker web管理界面了.

通过ui-for-docker,你可以对容器,容器网络,镜像,主机网络,Volumes进行管理。


使用nginx镜像

运行容器

docker run -p 80:80 --name mynginx -v $PWD/www:/www -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf -v $PWD/logs:/wwwlogs  -d nginx

命令说明:

  • -p 80:80:将容器的80端口映射到主机的80端口

  • --name mynginx:将容器命名为mynginx

  • -v $PWD/www:/www:将主机中当前目录下的www挂载到容器的/www

  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机中当前目录下的nginx.conf挂载到容器的/etc/nginx/nginx.conf

  • -v $PWD/logs:/wwwlogs:将主机中当前目录下的logs挂载到容器的/wwwlogs


使用mysql镜像

运行容器

docker run -p 3306:3306 --name mymysql -v $PWD/conf/my.cnf:/etc/mysql/my.cnf -v $PWD/logs:/logs -v $PWD/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

命令说明:

  • -p 3306:3306:将容器的3306端口映射到主机的3306端口

  • -v $PWD/conf/my.cnf:/etc/mysql/my.cnf:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf

  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs

  • -v $PWD/data:/mysql_data:将主机当前目录下的data目录挂载到容器的/mysql_data

  • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

使用tomcat镜像

运行容器

docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat

命令说明:

-p 8080:8080:将容器的8080端口映射到主机的8080端口

-v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test

使用python镜像

在~/python/myapp目录下创建一个 helloworld.py 文件,代码如下:

#!/usr/bin/pythonprint("Hello, World!");

运行容器

docker run  -v $PWD/myapp:/usr/src/myapp  -w /usr/src/myapp python:3.5 python helloworld.py

命令说明:

-v $PWD/myapp:/usr/src/myapp :将主机中当前目录下的myapp挂载到容器的/usr/src/myapp

-w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录

python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件

输出结果:

Hello, World!

使用redis镜像

运行容器

docker run -p 6379:6379 -v $PWD/data:/data  -d redis:3.2 redis-server --appendonly yes

命令说明:

-p 6379:6379 : 将容器的6379端口映射到主机的6379端口

-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data

redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置


连接、查看容器

使用redis镜像执行redis-cli命令连接到刚启动的容器,主机IP为172.17.0.1

docker exec -it 43f7a65ec7f8 redis-cli
172.17.0.1:6379> info 
...

使用mongo镜像

运行容器

docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2

命令说明:

-p 27017:27017 :将容器的27017 端口映射到主机的27017 端口

-v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录

docker run -it mongo:3.2 mongo --host 172.17.0.1 # 使用mongo镜像执行mongo 命令连接到刚启动的容器,主机IP为172.17.0.1

Httpd容器镜像使用概要

docker pull registry.aliyuncs.com/lxepoo/apache-php5 

docker run -itd --name apache -p 9999:80 (完整的镜像名)apache-php5 /bin/bash(用于进入容器内部) 可以选择-v 挂载。

1、简单方式运行 httpd:

docker run -it -d --name myhttpd httpd

访问方式:http://ip ,显示内置的缺省页面( It Works!)。

2、挂载本地网页目录运行httpd

docker run -it -d -p 81:80 --name myhttpd2 -v /www/:/usr/local/apache2/htdocs/ httpd

访问方式:http://ip:81 ,

本地网站的页面文件放到 /www/ 目录下,

容器内部的网站页面路径为: /usr/local/apache2/htdocs/

主机开放81端口,映射到容器中的80端口,容器的名称叫myhttpd2


注意事项:

开放端口:主机80 (或81端口),容器80

访问方法:http://主机IP:80 (或81端口)

运行docker run命令的终端要能访问 /www/这个本地目录,

如果是Docker Toolbox终端,可以用virtualbox图形界面配置共享本地目录给VM虚机,并将本地页面文件放到该目录下。

docker  run后面的参数 -v /home:/var/www/html:ro :  :ro参数说明只读.


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回