docker运行输出hello world
docker run ubuntu:18.10 /bin/echo "Hello world"
run: 与前面的 docker 组合来运行一个容器。
ubuntu:18.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器里执行的命令
运行交互式的容器
root@DESKTOP-TC0HL14:~# docker run -i -t ubuntu:18.10 /bin/bash
root@364d1f5780b3:/#
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
进入docker容器内,并查看系统版本
root@364d1f5780b3:/# cat /proc/version
Linux version 5.10.16.3-microsoft-standard-WSL2 (oe-user@oe-host) (x86_64-msft-linux-gcc (GCC) 9.3.0, GNU ld (GNU Binutils) 2.34.0.20200220) #1 SMP Fri Apr 2 22:23:49 UTC 2021
root@364d1f5780b3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@364d1f5780b3:/#
退出容器
root@364d1f5780b3:/# exit
exit
root@runoob:~#
后台模式
root@DESKTOP-TC0HL14:~# docker run -d ubuntu:18.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
bde6d6823cdb502006f99a30345bc16f59b8d6ab69f7997448df213450bb5b90
查看所有容器
root@DESKTOP-TC0HL14:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bde6d6823cdb ubuntu:18.10 "/bin/sh -c 'while t…" 4 seconds ago Up 3 seconds objective_euclid
created(已创建)
restarting(重启中)
running 或 Up(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
宿主主机内使用 docker logs 命令,查看容器内的标准输出:
root@DESKTOP-TC0HL14:~# docker logs bde6d6823cdb
我们使用 docker stop 命令来停止容器:
root@DESKTOP-TC0HL14:~# docker stop bde6d6823cdb
bde6d6823cdb
也可以通过 docker stop dockername
help用法:例如我们要查看 docker pull 指令的具体使用方法:
root@DESKTOP-TC0HL14:~# docker pull --help
拉取镜像
docker pull ubuntu
启动容器
以下命令使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
root@DESKTOP-TC0HL14:~# docker run -it ubuntu:18.10 /bin/bash
root@d21fb258d9e2:/#
查看所有的容器命令如下:
docker ps -a
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。
root@DESKTOP-TC0HL14:~# docker run -itd --name ubuntu-test ubuntu /bin/bash
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72d289c7ce1f ubuntu "/bin/bash" About a minute ago Up About a minute ubuntu-tes
docker attach:如果从这个容器退出,会导致容器的停止。
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
下面演示了使用 docker attach 命令。
root@DESKTOP-TC0HL14:~# docker attach 72d289c7ce1f
如果要导出本地某个容器,可以使用 docker export 命令。
root@DESKTOP-TC0HL14:~# docker export 72d289c7ce1f > ubuntu-test.tar
导出容器72d289c7ce1f快照到本地文件 ubuntu-test.tar。
这样将导出容器快照到本地文件。
可以使用 docker import 从容器快照文件中再导入为镜像,以下实例将快照文件 ubuntu-test.tar 导入到镜像 test/ubuntu:v1:
root@DESKTOP-TC0HL14:~# cat ubuntu-test.tar |docker import - test/ubuntu:v1
sha256:193b3451ae486368164c57b3140530544d3640ce58979b0d31996a7809ee9c6a
root@DESKTOP-TC0HL14:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu v1 193b3451ae48 2 minutes ago 72.8MB
此外,也可以通过指定 URL 或者某个目录来导入,例如:
docker import http://example.com/exampleimage.tgz example/imagerepo
删除容器使用 docker rm 命令:
root@DESKTOP-TC0HL14:~# docker rm -f d21fb258d9e2
d21fb258d9e2
下面的命令可以清理掉所有处于终止状态的容器。
root@DESKTOP-TC0HL14:~# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
接下来让我们尝试使用 docker 构建一个 web 应用程序。我们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
root@DESKTOP-TC0HL14:~# docker pull training/webapp #载入镜像
root@DESKTOP-TC0HL14:~# docker run -d -P training/webapp python app.py
-d:让容器在后台运行。
-P:将容器内部使用的网络端口随机映射到我们使用的主机上。
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b4b8cd28b52 training/webapp "python app.py" 4 seconds ago Up 3 seconds 0.0.0.0:49153->5000/tcp, :::49153->5000/tcp elastic_roentgen
这里多了端口信息
PORTS
0.0.0.0:49153->5000/tcp, :::49153->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 49153上。
通过访问 127.0.0.1:49153,可以看到容器信息
我们也可以通过 -p 参数来设置不一样的端口:
root@DESKTOP-TC0HL14:~# docker run -d -p 5000:5000 training/webapp python app.py
271e11221a06ed5284d597748030d7ae3138b4de1d0d625811d20bff2ddd2b02
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
271e11221a06 training/webapp "python app.py" 3 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp thirsty_easley
我可以使用 docker port 271e11221a06 或 docker port thirsty_easley 来查看容器端口的映射情况。
root@DESKTOP-TC0HL14:~# docker port 271e11221a06
5000/tcp -> 0.0.0.0:5000
5000/tcp -> :::5000
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
root@DESKTOP-TC0HL14:~# docker logs -f 5b4b8cd28b52
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
172.17.0.1 - - [19/Apr/2022 01:24:32] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [19/Apr/2022 01:24:33] "GET /favicon.ico HTTP/1.1" 404 -
查看WEB应用程序容器的进程
我们还可以使用 docker top 来查看容器内部运行的进程
root@DESKTOP-TC0HL14:~# docker top 5b4b8cd28b52
UID PID PPID C STIME TTY TIME CMD
root 961 940 0 09:21 ? 00:00:00 python app.py
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker ps -l 查询最后一次创建的容器:
oot@DESKTOP-TC0HL14:~# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
271e11221a06 training/webapp "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp thirsty_easley
我们可以使用 docker rm 命令来删除不需要的容器
root@DESKTOP-TC0HL14:~# docker rm thirsty_easley
Error response from daemon: You cannot remove a running container 271e11221a06ed5284d597748030d7ae3138b4de1d0d625811d20bff2ddd2b02. Stop the container before attempting removal or force remove
删除容器时,容器必须是停止状态,否则会报如上错误
我们可以使用 docker images 来列出本地主机上的镜像。
docker images
获取一个新的镜像
docker pull ubuntu:18.10
我们可以通过 docker search 命令搜索 httpd 来寻找适合我们的镜像。
root@DESKTOP-TC0HL14:~# docker search httpd
我们决定使用上图中的 httpd 官方版本的镜像,使用命令 docker pull 来下载镜像。
root@DESKTOP-TC0HL14:~# docker pull httpd
下载完成后,我们就可以使用这个镜像了。
root@DESKTOP-TC0HL14:~# docker run httpd
删除镜像,镜像删除使用 docker rmi 命令,比如我们删除 ubtuntu:15.10 镜像:
root@DESKTOP-TC0HL14:~# docker rmi ubuntu:15.10
创建镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
1.1更新镜像
更新镜像之前,我们需要使用镜像来创建一个容器。
root@DESKTOP-TC0HL14:~# docker run -it ubuntu:18.10 /bin/bash
root@ad835b256fb0:/# apt-get update
在运行的容器内使用 apt-get update 命令进行更新,可能需要先更新一下yaml源
在完成操作之后,输入 exit 命令来退出这个容器。
此时 ID 为 ad835b256fb0的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
root@DESKTOP-TC0HL14:~# docker commit -m="has update" -a="test" ad835b256fb0 test/ubuntu:v2
sha256:eace63a9fba9c870204d5dda8ded8819dc044fb8176adda9a6303ef0190f0b3f
-m: 提交的描述信息
-a: 指定镜像作者
ad835b256fb0:容器 ID
test/ubuntu:v2: 指定要创建的目标镜像名
使用我们的新镜像 test/ubuntu:v2 来启动一个容器
root@DESKTOP-TC0HL14:~# docker run -it test/ubuntu:v2 /bin/bash
root@3a264a683e21:/#
2.1构建镜像
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
root@DESKTOP-TC0HL14:~# cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "[email protected]"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd wb
RUN /bin/echo 'wb:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
docker build -t wb/centos:7.7 . #注意后面有个点
root@DESKTOP-TC0HL14:~# docker run -it ba1830a427bb /bin/bash
root@DESKTOP-TC0HL14:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
72e65c6f52ce ba1830a427bb "/bin/bash" 5 seconds ago Exited (139) 4 seconds ago
设置镜像标签
我们可以使用 docker tag 命令,为镜像添加一个新的标签。
root@DESKTOP-TC0HL14:~# docker tag eace63a9fba9 test/ubuntu:dev
root@DESKTOP-TC0HL14:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test/ubuntu dev eace63a9fba9 29 minutes ago 67.3MB
docker tag 镜像ID,这里是 eace63a9fba9 ,用户名称、镜像源名(repository name)和新的标签名(tag)。