容器是 Docker 的另一个核心概念,简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
创建容器
1新建容器
可以使用 docker create 令新建一个容器,例如:
[root@openEuler-node1 ~]# docker create busybox
c3e7310fa21a4a2d94b0bf6f881aed4fc8482d3d23a341f9563ce65c8027fd19
2启动容器
使用 docker [container] start 来启动一个已经创建的容器例如,启动创建的busybox容器
[root@openEuler-node1 ~]# docker start c3e7310fa21a
c3e7310fa21a
3新建并启动容器
[root@openEuler-node1 ~]# docker run ubuntu /bin/echo 'Hello world'
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7b1a6ab2e44d: Pull complete
Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322
Status: Downloaded newer image for ubuntu:latest
Hello world
注意:如果新建容器没有这个镜像会先拉取镜像再启动容器最后执行指令。
其中,-t选项让 Docker 分配一个伪终端( pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。更多的命令选项可以通过 man docker-run 命令来查看
[root@openEuler-node1 ~]# docker run -it ubuntu:lB .04 /bin/bash
root@afBbae53bdd3 /#
用户可以输入exit或者Ctrl+D退出
对于所创建的 bash 容器,当用户使用 exit 命令退出 bash 进程之后,容器也会自动退出这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的 必要了。
4守护态运行
更多的时候,需要让 Docker 容器在后台以守护态( Daemonized )形式运行 此时,可以 通过添加-d 参数来实现。
[root@openEuler-node1 ~]# docker run -d mysql:5.7 --name db
e7d8bcac87cddc1299f7a71879bece14c5d38d7d5257be03dd312d6d19c9ddb2
5查看容器输出
要获取容器的输出信息,可以通过 docker [container] logs命令。
[root@openEuler-node1 ~]# docker logs sql
2024-03-11 11:09:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
2024-03-11 11:09:22+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2024-03-11 11:09:22+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
2024-03-11 11:09:23+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specifiedYou need to specify one of the following as an environment variable:- MYSQL_ROOT_PASSWORD- MYSQL_ALLOW_EMPTY_PASSWORD- MYSQL_RANDOM_ROOT_PASSWORD
这里启动mysql报错也是非常常见的错误,因为需要初始root密码
停止容器
1暂停容器
可以使用 docker [container] pause CONTAINER [CONTAINER ... ]命令来暂 停一个运行中的容器。
[root@openEuler-node1 ~]# docker pause test
test
[root@openEuler-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87151b0e6fe7 ubuntu "bash" 35 seconds ago Up 34 seconds (Paused) test
可以用unpause 恢运行态
[root@openEuler-node1 ~]# docker unpause test
test
[root@openEuler-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
87151b0e6fe7 ubuntu "bash" 2 minutes ago Up 2 minutes test
2终止容器
可以使用 docker [container] stop 来终止一个运行中的容器 该命令的格式为
docker [container] stop [-t I - -time [=10]] [CONTA NER ...]
[root@openEuler-node1 ~]# docker stop test
test
重启容器
[root@openEuler-node1 ~]# docker restart test
3进入容器
在使用-d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行
操作 这个时候如果需要进入容器进行操作,推荐使用官方的 attach或 exec 命令
[root@openEuler-node1 ~]# docker run -itd ubuntu
b0613bfdcbe14f88138ed030f37907356069142bc755fa7a2ce33749385894dd
[root@openEuler-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0613bfdcbe1 ubuntu "bash" 4 seconds ago Up 3 seconds boring_wescoff
然而使用 attach 命令有时候并不方便 当多个窗口同时 attach 到同一个容器的时 候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
[root@openEuler-node1 ~]# docker attach b0613bfdcbe1
root@b0613bfdcbe1:/#
.exec 命令就比较方便,可以多窗口运行
[root@openEuler-node1 ~]# docker exec -it 685af6f5c5b9 bash
root@685af6f5c5b9:/# w11:25:37 up 8:16, 0 users, load average: 0.00, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
通过指定 it 参数来保持标准输入打开,并且分配 一个伪终端通过 exec 命令对容器执行操作是最为推荐的方式
4删除容器
可以使用 docker [container) rm 命令来删除处于终止或退出状态的容器,命令格式为
docker [container] rm
- - f, --force=false 是否强行终止并删除一个运行中的容器
- - i, --link=false :删除容器的连接 ,但保留容器;
- - v, --volumes=false :删除容器挂载的数据卷
[root@openEuler-node1 ~]# docker rm -f `docker ps -qa`
685af6f5c5b9
b0613bfdcbe1
利用反引号实现docker中容器的批量删除
5导入和导出容器
导出
docker [container] export [-o l - -output [=””] ] CONTAINER
其中,可以通过-o 选项来指定导出的 t ar 文件名,也可以直接通过重定向来实现 首先,查看所有的容器,如下所示:
[root@openEuler-node1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4d44b708c81b ubuntu:latest "bash" 6 seconds ago Exited (0) 5 seconds ago admiring_lamarr
015c53d29ae3 ubuntu:18.04 "/bin/bash" About a minute ago Exited (0) About a minute ago romantic_burnell
[root@openEuler-node1 ~]# docker export -o test_for_run.tar 4d44b708c81b
[root@openEuler-node1 ~]# ls
anaconda-ks.cfg dockerfile test_for_run.tar ubuntu_18.04.tar
导入
导出的文件又可以使用 docker [ container ] import 命令导人变成镜像,该命令格式为
docker import [-c | --change [ = [ ]]] [-m | -- message[=MESSAGE]] filelURLI- [REPOSITORY [:TAG]]
下面将导出的 test_ for_ run. tar 文件导人到系统中:
[root@openEuler-node1 ~]# docker import test_for_run.tar test/ubuntu:v1.0
sha256:aec871a8dd332ba4dc0828da48022c7f2e74111ca4cdd53da6700eec8703ca35
查看容器
1查看容器详情
[root@openEuler-node1 ~]# docker inspect 4d44b708c81b
就一条命令,可以根据容器的ID或名字看
2查看容器内进程
[root@openEuler-node1 ~]# docker top test
UID PID PPID C STIME TTY TIME CMD
root 11103 11087 0 19:43 pts/0 00:00:00 sh
3查看统计信息
[root@openEuler-node1 ~]# docker stats test CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
823457ad116b test 0.00% 144KiB / 3.297GiB 0.00% 946B / 0B 0B / 0B