运行web应用

2021-06-08 DOCKER 大约 4 分钟

使用 docker 构建一个 web 应用程序。我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。

# hello world

拉取一个镜像并运行

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker pull training/webapp
Using default tag: latest
latest: Pulling from training/webapp
Image docker.io/training/webapp:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e190868d63f8: Pull complete
909cd34c6fd7: Pull complete
0b9bfabab7c1: Pull complete
a3ed95caeb02: Pull complete
10bbbc0fc0ff: Pull complete
fca59b508e9f: Pull complete
e7ae2541b15b: Pull complete
9dd97ef58ce9: Pull complete
a4c1b0cb7af7: Pull complete
Digest: sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Status: Downloaded newer image for training/webapp:latest
docker.io/training/webapp:latest
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker run -d -P training/webapp python app.py
fd47761291acb8c593446fafc242fae0083b55a9267736176954151503d04b41
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

参数说明:

  • **-d:**让容器在后台运行。
  • **-P:**将容器内部使用的网络端口随机映射到我们使用的主机上。

# 查看 WEB 应用容器

使用 docker ps 来查看我们正在运行的容器:

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED             STATUS             PORTS
   NAMES
fd47761291ac   training/webapp   "python app.py"   2 minutes ago       Up 2 minutes       0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   unruffled_jennings
aa996b05499f   ubuntu            "/bin/bash"       About an hour ago   Up About an hour
   hopeful_goodall
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5
6
7

这里多了个端口信息:0.0.0.0:49153->5000/tcp;

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

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

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker run -d -p 5000:5000 training/webapp python app.py
8075924b1921aa542481db7b599fdf1bf63011cdd2ba21fa87a4d70eaf665abf
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED             STATUS             PORTS
   NAMES
8075924b1921   training/webapp   "python app.py"   8 seconds ago       Up 3 seconds       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     reverent_moore
fd47761291ac   training/webapp   "python app.py"   5 minutes ago       Up 5 minutes       0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   unruffled_jennings
aa996b05499f   ubuntu            "/bin/bash"       About an hour ago   Up About an hour
   hopeful_goodall
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5
6
7
8
9
10

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

# 网络端口的快捷方式

通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED             STATUS             PORTS
   NAMES
8075924b1921   training/webapp   "python app.py"   8 seconds ago       Up 3 seconds       0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     reverent_moore
fd47761291ac   training/webapp   "python app.py"   5 minutes ago       Up 5 minutes       0.0.0.0:49153->5000/tcp, :::49153->5000/tcp   unruffled_jennings
aa996b05499f   ubuntu            "/bin/bash"       About an hour ago   Up About an hour
   hopeful_goodall
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker port 8075924b1921
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker port  reverent_moore
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 查看日志

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

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker logs -f 8075924b1921
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [06/Jun/2021 08:06:29] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [06/Jun/2021 08:06:29] "GET /favicon.ico HTTP/1.1" 404 -
1
2
3
4

-f:docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。

# 查看容器进程

们还可以使用 docker top name/id 来查看容器内部运行的进程

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker top 8075924b1921
UID                 PID                 PPID                C                   STIME               TTY                 TIME
       CMD
root                2800                2779                0                   08:05               ?                   00:00:00            python app.py
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5

# 检查应用程序

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

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker inspect 8075924b1921
[
    {
        "Id": "8075924b1921aa542481db7b599fdf1bf63011cdd2ba21fa87a4d70eaf665abf",
        "Created": "2021-06-06T08:05:16.6358518Z",
        "Path": "python",
        "Args": [
            "app.py"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2800,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-06-06T08:05:21.0384116Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557",
        "ResolvConfPath": "/var/lib/docker/containers/8075924b1921aa542481db7b599fdf1bf63011cdd2ba21fa87a4d70eaf665abf/resolv.conf",
    }
]
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 停止应用容器

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker stop 8075924b1921
8075924b1921
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ ps
1
2
3

# 重启应用容器

已经停止的容器,我们可以使用命令 docker start 来启动。

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker start 8075924b1921
8075924b1921
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3

docker ps -l 查询最后一次创建的容器:

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker ps -l
CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS          PORTS                                       NAMES
8075924b1921   training/webapp   "python app.py"   18 minutes ago   Up 38 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   reverent_moore
wangyawei@yaweidediannao:/mnt/c/Users/ASUS$
1
2
3
4

# 移除WEB应用容器

我们可以使用 docker rm 命令来删除不需要的容器, 删除之前请先停止该容器

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker rm 8075924b1921
8075924b1921
1
2

删除容器时,容器必须是停止状态,否则会报如下错误

wangyawei@yaweidediannao:/mnt/c/Users/ASUS$ docker rm 8075924b1921
Error response from daemon: You cannot remove a running container 8075924b1921aa542481db7b599fdf1bf63011cdd2ba21fa87a4d70eaf665abf. Stop the container before attempting removal or force remove
1
2
上次编辑于: 2023年7月4日 09:36