docker学习(二)

5. 创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时, 我们可以通过以下两种方式对镜像进行更改:
. 从已经创建的容器中更新镜像, 并且提交这个镜像
. 使用Dockerfile指令来创建一个新的镜像

6. 更新镜像

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

docker run -t -i centos:6.10 /bin/bash

在运行的容器内使用 apt-get update 命令进行更新.
在完成操作之后, 输入exit命令来退出这个容器
此时 id 为 e218edb10236 的容器, 是按我们的需求更改的容器. 我们可以通过命令docker commit来提交容器副本.

docker commit -m="has update" -a="jin" e218edb10236 jin/centos:6.10
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee95236236

各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10236: 容器ID
jin/centos:6.10: 指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 jin/centos:6.10 :
```bash
docker images

jin@jinLab:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
jin/centos          v3                  70bf1840fd7c        15 seconds ago      158.5 MB
ubuntu              14.04               90d5884b1ee0        5 days ago          188 MB
php                 5.6                 f40e9e0f10c8        9 days ago          444.8 MB

使用我们的新镜像jin/centos来启动一个容器

docker run -t -i jin/centos:v3 /bin/bash
root@1a9fbdeb5d23:/#

7. 构建镜像

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

cat Dockerfile
FROM        centos:6.10
MAINTAINER  Fisher "fisher@sudops.com"

RUN         /bin/echo 'root@123456' | chpasswd
RUN         useradd jin
RUN         /bin/echo 'jin: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 指令告诉docket在镜像内执行命令,安装了什么.
然后,我们使用 Dockerfile文件, 通过docker build命令来构建一个镜像

```bash
docker build -t jin/centos:6.10 .
Sending build context to Docker daemon 17.92 KB
Step 1 : FROM centos:6.10
 ---> 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 jin
......

参数说明:
-t: 指定要创建的目标镜像名
.: Dockerfile 文件所在目录,可以指定 Dockerfile的绝对路径

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

docker images


jin@jinLab:~$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
jin/centos          6.10                 860c279d2f23        About a minute ago   190.6 MB
ubuntu              14.04               90d5884b1ee0        6 days ago           188 MB

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

docker run -t -i jin/centos:6.10    /bin/bash
id jin

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

8. 设置镜像标签

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

docker tag 860c279d2f23 jin/centos:dev

docker tag 镜像ID: 860c279d2f23, 用户名称, 镜像源名( repository name )和新的标签名(tag).
使用 docker images 命令可以看到, ID为 860c279d2f23的镜像多一个标签.

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
jin/centos          6.10                860c279d2f23        About a minute ago   190.6 MB
jin/centos          dev                 860c279d2f23        About a minute ago   190.6 MB
ubuntu              14.04               90d5884b1ee0        6 days ago           188 MB

Docker容器使用

1. Docker客户端

docker客户端非常简单, 我们可以直接输入 docker命令来查看到 Docker客户端的所有命令选项.

docker

可以通过命令 docker command --help 更深入的了解指定的 Docker命令使用方法.
例如我们要查看docker stats 指令的具体使用方法:

jin@jinLab:~# docker stats --help

#2. 运行一个web应用
前面我们运行的容器并没有一些特别的用处.
接下来让我们尝试使用docker构建一个web应用程序.
我们将在docker容器中运行一个Python Flask应用来运行一个web应用.
```bash
docker pull training/webapp # 载入镜像
docker run -d -P training/webapp python app.py

参数说明:
-d: 让容器在后台运行
-P: 将容器内部使用的网络端口映射到我们使用的主机上


#3. 查看WEB应用容器
使用docker ps来查看我们正在运行的容器:
```bash
docker ps
CONTAINER ID    IMAGE               COMMAND             ...     PORTS
d3d5e39ed933    training/webapp     "python app.py"     ...     0.0.0.0:32769->5000/tcp

这里多了端口信息.
0.0.0.0:32769->5000/tcp

Docker 开放了5000端口(默认Python Flask端口)映射到主机端口32769上
这时我们可以通过浏览器访问WEB应用

http://192.168.239.130:32769
hello world!

我们也可以通过-p参数来设置不一样的端口:

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

docker ps 查看正在运行的容器:

docker ps
CONTAINER ID        IMAGE                             PORTS                     NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp       wizardly_chandrasekhar
d3d5e39ed933        training/webapp     ...        0.0.0.0:32769->5000/tcp      xenodochial_hoov

容器内部的5000端口映射到我们本地主机的5000端口上.

4. 网络端口的快捷方式

通过 docker ps命令可以查看到容器的端口映射, docker还提供了另一个快捷方式 docker port, 使用docker port 可以查看指定( ID或者名字 )容器的某个确定端口映射到宿主机的端口号.
上面我们创建的web应用容器 ID为 bf08b7f2cd89 名字为 wizardly_chandrasekhar.
我们可以使用 docker port bf08b7f2cd89 或者 docker port wizardly_chandrasekhar 来查看容器端口的映射情况.

jin@jinLab:~$ docker port bf08b7f2cd89
5000/tcp -> 0.0.0.0:5000

jin@jinLab:~$ docker port wizardly_chandrasekhar
5000/tcp -> 0.0.0.0:5000

5. 查看WEB应用程序日志

docker logs [ID或者名字] 可以查看容器内部的标准输出

docker logs -f bf08b7f2cd89
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.3.23 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 -
192.168.3.23 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -

-f: 让 docker logs像使用 tail -f一样来输出容器内部的标准输出.
从上面, 我们可以看到应用程序使用的的是 5000 端口并且能够查看到应用程序的访问日志.

6. 查看WEB应用程序容器的进程

我们还可以使用docker top来查看容器内部运行的进行

docker top wizardly_chandrasekhar

UID     PID         PPID          ...       TIME                CMD
root    23225       23223         ...       00:00:00            python app.py

6. 检查WEB应用程序

使用 docker inspect 来查看 Docker的底层信息. 它会返回一个JSON文件记录着 docker 容器的配置和状态信息.

docker inspect wizardly_chandrasekhar

7. 停止WEB应用程序

docker stop wizardly_chandrasekhar

8. 重启WEB应用程序

docker start wizardly_chandrasekhar

查询最后一次创建的容器:

docker ps -l 

CONTAINER ID    IMAGE   PORTS   NAMES
bf08b7f2cd89        training/webapp     ...        0.0.0.0:5000->5000/tcp    wizardly_chandrasekhar

正在运行的容器,可以使用 docker restart 命令来重启.

9. 移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器

docker rm wizardly_chandrasekhar

删除容器时, 容器必须是停止状态, 否则会报如下错误
docker rm wizardly_chandrasekhar
Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove

Docker 容器连接
前面我们实现了通过网络端口来访问运行在docker容器内的服务. 下面我们来实现通过端口连接到一个docker容器.

1. 网络端口映射

我们创建了一个python应用的容器

docker run -d -P training/webapp python app.py

另外,我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1
我们使用-P参数创建一个容器, 使用 docker ps 来看到端口5000绑定主机端口 32768

docker ps


CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS       PORTS             NAMES
fce072cc88ce        training/webapp     "python app.py"     4 minutes ago       Up 4 minutes 0.0.0.0:32768->5000/tcp   grave_hopper

我们也可以使用-p标识来指定容器端口绑定到主机端口.
两种方式的区别是:
-P: 是容器内部端口随机映射到主机的高端口
-p: 是容器内部端口绑定到指定的主机端口

docker run -d -p 5000:5000 training/webapp python app.py
docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS     PORTS   NAMES
33e4523d30aa        training/webapp     "python app.py"     About a minute ago   Up About a minute 0.0.0.0:5000->5000/tcp    berserk_bartik
fce072cc88ce        training/webapp     "python app.py"     8 minutes ago        Up 8 minutes        0.0.0.0:32768->5000/tcp   grave_hopper

另外, 我们可以指定容器绑定的网络地址,比如绑定: 127.0.0.1

docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS  PORTS   NAMES
95c6ceef88ca        training/webapp     "python app.py"     6 seconds ago       Up 6 seconds        5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes        0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"     10 minutes ago      Up 10 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

这样我们就可以通过访问127.0.0.1:5001 来访问容器的5000端口
上面例子中, 默认都是绑定 tcp端口, 如果要绑定 udp 端口, 可以在端口后面加上 /udp

docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS  PORTS   NAMES
6779686f06f6        training/webapp     "python app.py"     4 seconds ago       Up 2 seconds        5000/tcp, 127.0.0.1:5000->5000/udp   drunk_visvesvaraya
95c6ceef88ca        training/webapp     "python app.py"     2 minutes ago       Up 2 minutes        5000/tcp, 127.0.0.1:5001->5000/tcp   adoring_stonebraker
33e4523d30aa        training/webapp     "python app.py"     5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp               berserk_bartik
fce072cc88ce        training/webapp     "python app.py"     12 minutes ago      Up 12 minutes       0.0.0.0:32768->5000/tcp              grave_hopper

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

docker port adoring_stonebraker 5000

2. Docker容器连接

端口映射并不是唯一把docker连接到另一个容器的方法
docker有一个连接系统允许将多个容器连接在一起,共享连接信息
docker连接会创建一个父子关系,其中父容器可以看到子容器的信息

3. 容器命名

当我们创建一个容器的时候, docker会自动对它进行命名. 另外,我们也可以使用--name标识来命名容器. e.g.:

docker run -d -P --name pyWebApp training/webapp python.py

我们可以使用 docker ps命令来查看容器名称

docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS  PORTS   NAMES
43780a6eabaa        training/webapp     "python app.py"     3 minutes ago       Up 3 minutes    0.0.0.0:32769->5000/tcp   pyWebApp
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容