前言
在Ubuntu系统中安装完Docker后,就可以通过一个入门程序来学习Docker的基本使用。在此程序中,首先编写Dockerfile及其相关文件,然后构建镜像,创建并启动容器,最后查看运行结果。具体步骤如下。
(1)创建一个新的Docker工作目录dockerspace,进入该目录
root@ubuntu:~# mkdir dockerspace
root@ubuntu:~# cd dockerspace/
(2)新建并打开一个Dockerfile文件(当文件不存在时vim会自动创建)
root@ubuntu:~/dockerspace# sudo vim Dockerfile
(3)编写Dockerfile文件,写入以下内容
# 使用Docker官方的python作为一个基础镜像
FROM python:2.7-slim
# 设置工作目录/app
WORKDIR /app
# 复制当前目录下的所有内容到容器内的/app目录下
ADD . /app
# 安装在requirements.txt文件中声明的文件包
RUN pip install -r requirements.txt
# 设置容器暴露的端口号为80
EXPOSE 80
# 定义环境变量
ENV NAME World
# 当容器启动后立即运行 app.py
CMD ["python", "app.py"]
Dockerfile的作用是在一个基础镜像上安装其他程序来构建一个新的镜像,这个过程涉及了两个外部文件requirements.txt和app.py
(4)编写外部文件,在当前目录(dockerspace)下分别创建requirements.txt和app.py。
# requirements.txt的内容
Flask
Redis
文件中的Flask和Redis就是使用pip指令安装的工具
# app.py的内容
from flask import Flask
from redis import Redis, RedisError
import os
import socket
redis = 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)
app.py就是一个简单的Python应用,Docker容器启动后会运行该应用,访问该应用则会返回一些字符串信息
(5)创建镜像。在Dockerfile文件所在目录下使用docker build指令运行Dockerfile文件生成一个Docker镜像,名称为hellodocker
root@ubuntu:~/dockerspace# docker build -t hellodocker .
-t指定生成镜像名称,“.”代表当前目录下的应用上下文(即Dockerfile所在目录,如果Dockerfile不在当前目录则需将点号换成Dockerfile所在目录)
(5)查看镜像。
root@ubuntu:~/dockerspace# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hellodocker latest 27bb09e2ed77 2 minutes ago 159MB
python 2.7-slim eeb27ee6b893 4 weeks ago 148MB
hello-world latest bf756fb1ae65 4 months ago 13.3kB
列表中不仅包含hellodocker镜像,还包含Dockerfile文件中依赖的基础镜像Python
(6)创建并启动容器。
root@ubuntu:~/dockerspace# docker run -d -p 5000:80 hellodocker
e590aa7c44b27dc4dbb33c4c7b220d04a78d2ee7c7a0ed6fa0319ab816aab4b4
-d代表在后台运行,-p参数将容器暴露的80端口映射到宿主机的5000端口
(7)查看运行容器。
root@ubuntu:~/dockerspace# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e590aa7c44b2 hellodocker "python app.py" 53 seconds ago Up 52 seconds 0.0.0.0:5000->80/tcp fervent_carson
或
root@ubuntu:~/dockerspace# docker container ls
(8)访问程序,查看结果。使用宿主机的浏览器访问地址http://localhost:5000来访问程序(下图是物理机中,则需要写虚拟机的地址)
(9)停止容器(后面跟的是生成容器的ID)
root@ubuntu:~/dockerspace# docker stop e590aa7c44b2
e590aa7c44b2
出现的问题
(1)首次使用vim打开文件时可能会报如下错
The program ‘vim’ can be found in the following packages:
原因:没有安装vim
vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序设计。
以下是安装vim的命令
sudo apt-get install vim
(2)安装过程中出现资源锁问题
E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?
解决方法:杀掉进程
root@ubuntu:~# ps afx|grep apt
5847 pts/2 S+ 0:00 \_ grep --color=auto apt
3179 ? SNl 0:01 /usr/bin/python3 /usr/sbin/aptd
3371 ? Ss 0:00 /bin/sh /usr/lib/apt/apt.systemd.daily install
3385 ? S 0:00 \_ /bin/sh /usr/lib/apt/apt.systemd.daily lock_is_held install
5828 pts/6 Ds+ 0:00 \_ /usr/bin/dpkg --status-fd 10 --unpack --auto-deconfigure /var/cache/apt/archives/libc6-dbg_2.23-0ubuntu10_amd64.deb /var/cache/apt/archives/libc6-dev_2.23-0ubuntu10_amd64.deb /var/cache/apt/archives/libc-dev-bin_2.23-0ubuntu10_amd64.deb /var/cache/apt/archives/linux-libc-dev_4.4.0-179.209_amd64.deb /var/cache/apt/archives/libc6_2.23-0ubuntu10_amd64.deb
5843 pts/6 S+ 0:00 \_ dpkg-deb --fsys-tarfile /var/cache/apt/archives/libc6-dev_2.23-0ubuntu10_amd64.deb
5844 pts/6 S+ 0:00 \_ dpkg-deb --fsys-tarfile /var/cache/apt/archives/libc6-dev_2.23-0ubuntu10_amd64.deb
5845 pts/6 S+ 0:00 \_ dpkg-deb --fsys-tarfile /var/cache/apt/archives/libc6-dev_2.23-0ubuntu10_amd64.deb
root@ubuntu:~# kill -9 3371
root@ubuntu:~# kill -9 3385
(3)运行Dockerfile文件时,因为里面有pip语句,可能会报以下错误
python pip是一个安装和管理 Python 包的工具
ERROR: Could not find a version that satisfies the requirement Flask (from -r requirements.txt (line 1)) (from versions: none)
ERROR: No matching distribution found for Flask (from -r requirements.txt (line 1))
The command ‘/bin/sh -c pip install -r requirements.txt’ returned a non-zero code: 1
原因:
ubuntu系统虽然自带了不同版本的python,但都没有安装pip,pyhton2.7下使用的是pip2,python3.5下使用的是pip3。下面是各自安装命令。
解决:安装pip2
root@ubuntu:~/dockerspace# sudo apt-get install python-pip python-dev build-essential
安装完还报错的话,有时候是pip的版本太高,需要降级pip,降级完后就可以成功执行了。
root@ubuntu:~/dockerspace# pip install pip==18.1
(4)报错pip ReadTimeoutError:HTTPSConnectionPool(host=‘files.pythonhosted.org’, port=443): Read timed out.
原因:在下载python库的时候,由于国内网络原因,python包的下载速度非常慢,查看pip 文档,只要在 pip的时候控制超时即可, 具体参数为 --default-timeout=100, 后面的时间可以自己指定。
解决:pip install --default-timeout=1000 --no-cache-dir -r requirements.txt (没作用)
更改pip的国内源
root@ubuntu:~# cd .pip
-bash: cd: .pip: No such file or directory
root@ubuntu:~# mkdir .pip
root@ubuntu:~# cd .pip
root@ubuntu:~/.pip# touch pip.conf
root@ubuntu:~/.pip# vim pip.conf
pip.conf中写入以下内容(华中大的源)
[global]
index-url = https://pypi.mirrors.ustc.edu.cn/simple