Ubuntu中Docker入门程序

前言


在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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值