docker学习笔记之三 容器
现在我们根据教程创建一个容器。
使用Dockerfile 定义一个容器 首先我们先创建一个文件夹。我创建的文件夹的路径如下:
1 2 $ pwd /home/baoguoxiao/docker
我们使用cd 命令进入到该文件夹。然后我们创建一个叫做Dockerfile 的文件。把以下内容复制并粘贴到刚才创建的文件中并保存。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 FROM python:2.7-slim WORKDIR /app ADD . /app RUN pip install --trusted-host pypi.python.org -r requirements.txt EXPOSE 80 ENV NAME World CMD ["python", "app.py"]
这个文件提到了我们两个没有创建的文件,requirements.txt 和app.py ,下面我将会给出两个文件的内容,将以下内容复制并粘贴到相应的文件中,并且这两个文件和Dockerfile 一样,属于同级目录。
requirements.txt
app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from flask import Flaskfrom redis import Redis, RedisErrorimport osimport socketredis = Redis(host="redis" , db=0 , socket_connect_timeout=2 , socket_timeout=2 ) app = Flask(__name__) @app.route("/" ) def hello (): try : visits = redis.incr("counter" ) except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format (name=os.getenv("NAME" , "world" ), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__" : app.run(host='0.0.0.0' , port=80 )
可以看到我们安装了Flask和Redis库,但是我们并没有安装Redis数据库,所以我们期望在完成的时候能够提示错误信息。
构建应用程序 我们准备要构建我们的程序了,首先我们要保证我们处于原来的目录。现在我们看下我们目前的目录的内容:
1 2 $ ls app.py Dockerfile requirements.txt
现在我们执行命令,它会创建一个镜像。使用**-t**设定一个更加友好的名字:
1 docker build -t friendlyhello .
现在我们查看一下我们的镜像列表:
1 2 3 4 5 $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE friendlyhello latest bc24eaee5b6d 10 minutes ago 148MB python 2.7-slim 4fd30fc83117 8 weeks ago 138MB 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 2 3 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 docker build -t friendlyhello . docker run -p 4000:80 friendlyhello docker run -d -p 4000:80 friendlyhello docker container ls docker container ls -a docker container stop <hash > docker container kill <hash > docker container rm <hash > docker container rm $(docker container ls -a -q) docker image ls -a docker image rm <image id > docker image rm $(docker image ls -a -q) docker login docker tag <image> username/repository:tag docker push username/repository:tag docker run username/repository:tag