Hello world、容器使用
Docker Hello world
# Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。输出Hello world
[root@docker ~]# docker run ubuntu:15.10 /bin/echo "Hello world"
Unable to find image 'ubuntu:15.10' locally
15.10: Pulling from library/ubuntu
7dcf5a444392: Pull complete
759aa75f3cee: Pull complete
3fa871dc8a2b: Pull complete
224c42ae46e7: Pull complete
Digest: sha256:02521a2d079595241c6793b2044f02eecf294034f31d6e235ac4b2b54ffc41f3
Status: Downloaded newer image for ubuntu:15.10
Hello world
-
docker: Docker 的二进制执行文件。
-
run: 与前面的 docker 组合来运行一个容器。
-
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
-
/bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果.
运行交互式的容器
通过 docker 的两个参数 ,让 docker 运行的容器实现"对话"的能力:
-
-t: 在新容器内指定一个伪终端或终端。
-
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
[root@docker ~]# docker run -i -t ubuntu:15.10 /bin/bash # 进入一个 ubuntu15.10 系统的容器, cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表 root@d8853ebe1ab7:/# cat /proc/version Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018 root@d8853ebe1ab7:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var # exit或ctrl+D退出容器 root@d8853ebe1ab7:/# exit [root@docker ~]#
启动容器(后台模式)
[root@docker ~]# docker run -d ubuntu:15.10 /bin/sh -c "while true;do echo hello world;sleep 1;done" d3be21610b1996d462572ccdcab84b58df77cac5cd7bee855d81ae9100c0bc0a # 在输出中,我们没有看到期望的 "hello world",而是一串长字符.这个长字符串叫做容器 ID,是唯一的,我们可以通过容器 ID 来查看对应的容器发生了什么。 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3be21610b19 ubuntu:15.10 "/bin/sh -c 'while t…" About a minute ago Up About a minute xenodochial_morse
输出详情 状态 CONTAINER ID 容器 ID created(已创建) IMAGE 启动容器时运行的命令 restarting(重启中) COMMAND 启动容器时运行的命令 running 或 Up(运行中) CREATED 容器的创建时间 removing(迁移中) STATUS 容器状态 paused(暂停) PORTS 容器的端口信息和使用的连接类型(tcp\udp) exited(停止) NAMES 自动分配的容器名称 dead(死亡) Docker容器使用
Docker客户端
# 直接输入 docker 命令来查看到 Docker 客户端的所有命令选项,通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。例如我们要查看 docker stop 指令的具体使用方法: [root@docker ~]# docker [root@docker ~]# docker stop --help
拉取镜像、启动、停止
# 获取镜像 如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像: [root@docker ~]# docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 7b1a6ab2e44d: Pull complete Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest # 启动容器 使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器: [root@docker ~]# docker run -it ubuntu /bin/bash root@74964faa7ca1:/#
-
ubuntu: ubuntu 镜像
-
/bin/bash: 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
# 使用 docker start 启动一个已停止的容器 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74964faa7ca1 ubuntu "/bin/bash" 2 minutes ago Exited (0) 3 seconds ago dazzling_buck [root@docker ~]# docker start 74 74 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 74964faa7ca1 ubuntu "/bin/bash" 3 minutes ago Up 7 seconds dazzling # 后台运行 在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式,加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec [root@docker ~]# docker run -itd --name ubuntu-test ubuntu /bin/bash 17958ffd5489c09d44297679a6876795eef7d6c65881241727acef0d1d85b66b [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17958ffd5489 ubuntu "/bin/bash" 6 seconds ago Up 5 seconds ubuntu-test # 停止一个容器,停止的容器可以通过 docker restart 重启 [root@docker ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17958ffd5489 ubuntu "/bin/bash" 6 seconds ago Up 5 seconds ubuntu-test [root@docker ~]# docker stop 17 17 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17958ffd5489 ubuntu "/bin/bash" 3 minutes ago Exited (0) 8 seconds ago ubuntu-test [root@docker ~]# docker restart 17 17 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 17958ffd5489 ubuntu "/bin/bash" 3 minutes ago Up 3 seconds ubuntu-test
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
# docker attach 命令:从这个容器退出,会导致容器的停止。
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17958ffd5489 ubuntu "/bin/bash" 3 minutes ago Up 3 seconds ubuntu-test
[root@docker ~]# docker attach 17
root@17958ffd5489:/# exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17958ffd5489 ubuntu "/bin/bash" 8 minutes ago Exited (0) 8 seconds ago ubuntu-test
# docker exec 命令(推荐):从这个容器退出,容器不会停止
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17958ffd5489 ubuntu "/bin/bash" 10 minutes ago Up 8 seconds ubuntu-test
[root@docker ~]# docker exec -it 17 /bin/bash
root@17958ffd5489:/# exit
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
17958ffd5489 ubuntu "/bin/bash" 11 minutes ago Up About a minute ubuntu-test
导出、导入、删除(容器)
# 导出容器 17 快照到本地文件 ubuntu.tar,这样将导出容器快照到本地文件
[root@docker ~]# docker export 17 > ubuntu.tar
[root@docker ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Videos
Desktop Downloads Music Public ubuntu.tar
# 使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件ubuntu.tar 导入到镜像 test/ubuntu:v1:
[root@docker ~]# cat ubuntu.tar | docker import - test/ubuntu:v1
sha256:f6d588cc74ff76d52f034c8c2f7bbe711c214e1cab58e4f2d6318b0b5fa9cab2
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 f6d588cc74ff 10 seconds ago 72.8MB
# 删除容器使用 docker rm 命令
[root@docker ~]# docker rm -f 1c
1c
# 清理掉所有处于终止状态的容器
[root@docker ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
6b21e9eddcda9c5b79392e31c820f162b9e80f1205286ee94f03bdc116b0ac3a
74964faa7ca18f311e97f36d817ff7d1acba6d29439f67355c7085127c4b5f7e
Total reclaimed space: 0B
运行一个web应用、查看web应用容器
# 使用 docker 构建一个 web 应用程序,我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用
[root@docker ~]# docker pull training/webapp
[root@docker ~]# docker run -d -P training/webapp python app.py
47d5ad9623c4d5b85ff162e0938fa3c3e49b45bb2e7236640b35fd6738d342c3
# 查看web应用容器:多了端口信息
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47d5ad9623c4 training/webapp "python app.py" 14 seconds ago Up 13 seconds 0.0.0.0:32768->5000/tcp, :::32768->5000/tcp distracted_bose
# 通过 -p 参数来设置不一样的端口
[root@docker ~]# docker run -d -p 5000:5080 training/webapp python app.py
fd0321e13c40db9f14076e7a14bd33e315443f292194b3fcde6a98a82d5c2432
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fd0321e13c40 training/webapp "python app.py" 5 seconds ago Up 4 seconds 5000/tcp, 0.0.0.0:5000->5080/tcp, :::5000->5080/tcp stoic_einstein
47d5ad9623c4 training/webapp "python app.py" 8 minutes ago Up 8 minutes 0.0.0.0:32768->5000/tcp, :::32768->5000/tcp distracted_bose
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。这时我们可以通过浏览器访问WEB应用
- **-d: **让容器在后台运行。
- -P: 将容器内部使用的网络端口随机映射到我们使用的主机上。
网络端口的快捷方式、查看web应用程序日志和容器进程
# 使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47d5ad9623c4 training/webapp "python app.py" 5 days ago Up 5 days 0.0.0.0:32768->5000/tcp, :::32768->5000/tcp distracted_bose
[root@docker ~]# docker port 47
5000/tcp -> 0.0.0.0:32768
5000/tcp -> [::]:32768
# docker logs [ID或者名字] 可以查看容器内部的标准输出。-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
[root@docker ~]# docker logs -f 47
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET / HTTP/1.1" 200 -
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [18/Mar/2023 15:03:32] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET / HTTP/1.1" 200 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:02] "GET /favicon.ico HTTP/1.1" 404 -
192.168.130.20 - - [24/Mar/2023 10:23:05] "GET / HTTP/1.1" 200 -
# 使用 docker top 来查看容器内部运行的进程
[root@docker ~]# docker top 47
UID PID PPID C STIME TTY TIME CMD
root 72749 72729 0 17:47 ? 00:00:00 python app.py
检查、停止、重启、移除(web应用程序)
# 使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
[root@docker ~]# docker stop 47
47
# 正在运行的容器,我们可以使用 docker restart 命令来重启。
[root@docker ~]# docker start 47
47
# 使用 docker rm 命令来删除不需要的容器,删除容器时,容器必须是停止状态
[root@docker ~]# docker rm 47
47