0%

docker学习笔记之三 容器

docker学习笔记之三 容器

现在我们根据教程创建一个容器。

使用Dockerfile定义一个容器

首先我们先创建一个文件夹。我创建的文件夹的路径如下:

1
$ pwd
2
/home/baoguoxiao/docker

我们使用cd命令进入到该文件夹。然后我们创建一个叫做Dockerfile的文件。把以下内容复制并粘贴到刚才创建的文件中并保存。

1
# 使用官方的python作为父镜像
2
FROM python:2.7-slim
3
4
# 设置工作目录为 /app
5
WORKDIR /app
6
7
# 复制当前文件夹的内容到容器的 /app目录
8
ADD . /app
9
10
# 安装在requirements.txt中指定的所必须的包
11
RUN pip install --trusted-host pypi.python.org -r requirements.txt
12
13
# 定义80端口对容器外可用
14
EXPOSE 80
15
16
# 定义环境变量
17
ENV NAME World
18
19
# 当容器启动时运行 app.py
20
CMD ["python", "app.py"]

这个文件提到了我们两个没有创建的文件,requirements.txtapp.py,下面我将会给出两个文件的内容,将以下内容复制并粘贴到相应的文件中,并且这两个文件和Dockerfile一样,属于同级目录。

requirements.txt

1
Flask
2
Redis

app.py

1
from flask import Flask
2
from redis import Redis, RedisError
3
import os
4
import socket
5
6
# Connect to Redis
7
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
8
9
app = Flask(__name__)
10
11
@app.route("/")
12
def hello():
13
    try:
14
        visits = redis.incr("counter")
15
    except RedisError:
16
        visits = "<i>cannot connect to Redis, counter disabled</i>"
17
18
    html = "<h3>Hello {name}!</h3>" \
19
           "<b>Hostname:</b> {hostname}<br/>" \
20
           "<b>Visits:</b> {visits}"
21
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)
22
23
if __name__ == "__main__":
24
    app.run(host='0.0.0.0', port=80)

可以看到我们安装了Flask和Redis库,但是我们并没有安装Redis数据库,所以我们期望在完成的时候能够提示错误信息。

构建应用程序

我们准备要构建我们的程序了,首先我们要保证我们处于原来的目录。现在我们看下我们目前的目录的内容:

1
$ ls
2
app.py  Dockerfile  requirements.txt

现在我们执行命令,它会创建一个镜像。使用-t设定一个更加友好的名字:

1
docker build -t friendlyhello .

现在我们查看一下我们的镜像列表:

1
$ docker image ls
2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
3
friendlyhello       latest              bc24eaee5b6d        10 minutes ago      148MB
4
python              2.7-slim            4fd30fc83117        8 weeks ago         138MB
5
hello-world         latest              f2a91732366c        2 months ago        1.85kB

运行APP

运行APP,我们使用机器的4000端口跟发布的容器的80端口进行映射:

1
docker run -p 4000:80 friendlyhello

启动之后,我们就可以访问 http://localhost:4000 来访问了。

我们这里是使用真实系统的4000端口来映射到我们生成的镜像的80端口。

Ctrl+C强制退出。

现在我们用后台守护进程运行程序。

1
docker run -d -p 4000:80 friendlyhello

现在我们使用以下命令查看目前正在运行的容器。

1
$ docker container ls
2
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
3
27d94a4c5481        friendlyhello       "python app.py"     7 minutes ago       Up 7 minutes        0.0.0.0:4000->80/tcp   vigilant_easley

现在我们将我们运行的docker停止。

1
docker container stop 27d94a4c5481

27d94a4c5481是我运行的容器ID。每台机器的容器ID是不同,在运行此命令时请自主替换相关容器ID。

分享镜像

首先我们需要执行以下命令进行登陆,期间会要求输入docker ID以及密码,如果没有账号,可点击此处进行账号注册。

首先我们推荐设定一个tag,这样才能方便对镜像进行管理。首先我们先看看语法格式:

1
docker tag image username/repository:tag

例如:

1
docker tag mowangjuanzi/get-started:part2

然后我们将这个镜像进行上传:

1
docker push mowangjuanzi/get-started:part2

命令总结

1
docker build -t friendlyhello .  # 使用目录的Dockerfile文件创建镜像
2
docker run -p 4000:80 friendlyhello  # 运行"friendlyname"映射端口4000到80
3
docker run -d -p 4000:80 friendlyhello         # 同上,但是是后台运行模式
4
docker container ls                                # 列出所有运行的容器
5
docker container ls -a             # 列出所有容器,甚至那些不运行的
6
docker container stop <hash>           # 优雅的停止指定容器
7
docker container kill <hash>         # 强制关闭指定容器
8
docker container rm <hash>        # 从这个机器中移除指定容器
9
docker container rm $(docker container ls -a -q)         # 移除全部容器
10
docker image ls -a                             # 列出这个机器中所有的镜像
11
docker image rm <image id>            # 从这个机器中移除指定镜像
12
docker image rm $(docker image ls -a -q)   # 从这个机器中移除所有镜像
13
docker login             # 使用你的docker证书进行登陆
14
docker tag <image> username/repository:tag  # tag要上传到存储库的<image>
15
docker push username/repository:tag            # 上传标记的镜像到docker光放存储库
16
docker run username/repository:tag                   # 从存储库运行镜像