Docker Hello World
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
tianbao@tianbao:~$ sudo docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo "Hello world": 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果。
运行交互式的容器
tianbao@tianbao:~$ sudo docker run -i -t ubuntu:15.10 /bin/bash
root@5d21c20d6607:/#
各个参数解析:
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
注意第二行 root@5d21c20d6607:/#,此时我们已进入一个 ubuntu15.10 系统的容器
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表
我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器
启动容器(后台模式)
tianbao@tianbao:~$ sudo docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
我们需要确认容器有在运行,可以通过 docker ps 来查看
tianbao@tianbao:~$ sudo docker ps
[sudo] password for tianbao:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c7178a477b6 ubuntu:15.10 "/bin/sh -c 'while t…" 2 minutes ago Up 2 minutes zen_bouman
fd5dc8ae48c4 thespaghettidetective_tasks "sh -c 'celery -A co…" 3 months ago Up About an hour 3334/tcp thespaghettidetective_tasks_1
50bf59dc335a thespaghettidetective_web "sh -c 'python manag…" 3 months ago Up About an hour 0.0.0.0:3334->3334/tcp thespaghettidetective_web_1
8f3a3bb37848 thespaghettidetective_ml_api "bash -c 'gunicorn -…" 3 months ago Up About an hour 3333/tcp thespaghettidetective_ml_api_1
b89f42d1d285 redis:5.0-alpine "docker-entrypoint.s…" 3 months ago Up About an hour 6379/tcp thespaghettidetective_redis_1
tianbao@tianbao:~$
输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:
- created(已创建)
- restarting(重启中)
- running 或 Up(运行中)
- removing(迁移中)
- paused(暂停)
- exited(停止)
- dead(死亡)
PORTS: 容器的端口信息和使用的连接类型(tcpudp)。
NAMES: 自动分配的容器名称。
在宿主主机内使用 docker logs 命令,查看容器内的标准输出
停止容器
通过 docker ps 查看容器ID和容器名
使用 docker stop 命令来停止容器
容器使用
获取镜像
如果我们本地没有 ubuntu 镜像,我们可以使用 docker pull 命令来载入 ubuntu 镜像
docker pull ubuntu
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器
docker run -it ubuntu /bin/bash
参数说明:
- -i: 交互式操作。
- -t: 终端。
- ubuntu: ubuntu 镜像。
- /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
启动已停止运行的容器
docker start b750bbbcfd88
后台运行
docker run -itd --name ubuntu-test ubuntu /bin/bash
注:加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入:
- docker attach
- docker exec:推荐大家使用 docker exec 命令,因为此退出容器终端,不会导致容器的停止。
attach 命令
下面演示了使用 docker attach 命令
docker attach 1e560fca3906
注意: 如果从这个容器退出,会导致容器的停止。
exec 命令
下面演示了使用 docker exec 命令。
docker exec -it 243c32535da7 /bin/bash
注意: 如果从这个容器退出,不会导致容器的停止,这就是为什么推荐大家使用 docker exec 的原因。
更多参数说明请使用 docker exec --help 命令查看
导出和导入容器
docker export 1e560fca3906 > ubuntu.tar
导出容器 1e560fca3906 快照到本地文件 ubuntu.tar
这样将导出容器快照到本地文件。
导入容器快照
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu.tar 导入到镜像 test/ubuntu:v1:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
此外,也可以通过指定 URL 或者某个目录来导入
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器
docker ps -a
docker rm -f 1e560fca3906
下面的命令可以清理掉所有处于终止状态的容器。
docker container prune
运行一个 web 应用
接下来让我们尝试使用 docker 构建一个 web 应用程序
tianbao@tianbao:~$ sudo docker pull training/webapp # 载入镜像
tianbao@tianbao:~$ sudo docker run -d -P training/webapp python app.py
参数说明:
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口随机映射到我们使用的主机上
查看 WEB 应用容器
tianbao@tianbao:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ba27ee3196c training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32768->5000/tcp hungry_darwin
通过 -p 参数来设置不一样的端口
tianbao@tianbao:~$ sudo docker run -d -p 5000:5000 training/webapp python app.py
容器内部的 5000 端口映射到我们本地主机的 5000 端口上
网络端口的快捷方式
使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号
tianbao@tianbao:~$ sudo docker port 0ea61c947a6a
5000/tcp -> 0.0.0.0:5000
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
查看WEB应用程序容器的进程
tianbao@tianbao:~$ sudo docker top 0ea61c947a6a
UID PID PPID C STIME TTY TIME CMD
root 14867 14839 0 10:38 ? 00:00:00 python app.py
tianbao@tianbao:~$
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息
tianbao@tianbao:~$ sudo docker inspect 0ea61c947a6a
停止 WEB 应用容器
tianbao@tianbao:~$ sudo docker stop 0ea61c947a6a
重启WEB应用容器
tianbao@tianbao:~$ sudo docker start 0ea61c947a6a
docker ps -l 查询最后一次创建的容器
tianbao@tianbao:~$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ea61c947a6a training/webapp "python app.py" 58 minutes ago Up 31 seconds 0.0.0.0:5000->5000/tcp brave_nobel
tianbao@tianbao:~$
正在运行的容器,我们可以使用 docker restart 命令来重启
tianbao@tianbao:~$ sudo docker restart 0ea61c947a6a
移除WEB应用容器
删除容器时,容器必须是停止状态,否则会报错误
tianbao@tianbao:~$ sudo docker stop 0ea61c947a6a
tianbao@tianbao:~$ sudo docker rm 0ea61c947a6a