文章目录
- 一、启动容器
- 启动容器用法
- 二、查看容器状态
- 三、容器相关操作
- 删除容器
- 容器的开启和停止
- 进入容器
- attach
- exec
- 暴露容器的端口
- 查看容器的日志
- 传递运行命令
- 容器内部的hosts文件
- 指定容器的DNS
- 容器内和宿主机之间复制文件
一、启动容器
容器的生命周期
docker run可以启动容器,进入到容器,并随机生成容器ID和名称。
启动容器的流程
1.docker会在本地寻找镜像
2.判断本机是否有这个镜像,如果有就运行这个镜像。
3.如果没有,去镜像仓库下载这个镜像(如果仓库没有,则失败),下载至本地后,运行这个镜像。
启动容器用法
命令 | 含义 |
---|---|
-i, --interactive | 保持标准输入开放,即使没有连接。通常与 -t 一起使用,允许你与容器进行交互。 |
-t, --tty | 分配一个伪 TTY(终端)。通常与 -i 一起使用,提供一个交互式 shell。 |
-d, --detach | 在后台运行容器,并打印容器 ID。容器会在后台运行,不会占用当前终端。 |
–name string | 为容器指定一个名称,方便后续引用和管理。 |
–h, --hostname | 设置容器的主机名。 |
–rm | 容器退出时自动删除。适用于临时性的容器。 |
-p, --publish | 将容器的端口映射到主机。格式为 hostPort:containerPort。 |
-P, --publish-all | 将容器所有暴露的端口随机映射到主机端口。 |
–dns list | 为容器设置自定义 DNS 服务器。 |
–entrypoint string | 覆盖镜像中默认的 ENTRYPOINT 指令,ENTRYPOINT中定义了容器启动时要运行的命令。 |
–restart policy | 设置容器的重启策略,如 always, on-failure 等。 |
–privileged | 给予容器扩展权限。容器几乎可以做主机能做的所有事。 |
-e, --env=[] | 设置环境变量。可以多次使用来设置多个环境变量。 |
–env-file=[] | 从文件中读取环境变量。文件中每行一个环境变量。 |
后台启动容器
docker run -d httpd
直接运行会在后台执行
设置容器退出后的启动规则
policy | 说明 |
---|---|
no | 默认是no;容器退出时不自动重启 |
on-failure[:max-retries]: | 仅当容器以非零状态退出时才重启,退出码 0 通常表示程序成功执行并正常退出。 |
always | 无论退出状态如何,总是重启容器。 Docker 守护进程会无限期地尝试重启容器。 |
unless-stopped | 类似于 always,但有一个重要区别: 如果容器之前被手动停止,Docker 守护进程启动时不会自动启动该容器。 |
docker run -d --restart always httpd
启动容器执行一次性的命令
系统类的容易,启动后没有执行任何操作,不想httpd、nginx等程序需要持续向外提供服务,所以系统类的默认是一次性的,容器启动就退出。
执行一次就退出
使用命令系统类容器持续运行
docker run -it centos:7 bash
-i 表示和容器进行交互
-t 分配一个运行的虚拟终端
在容器中新建文件,存放在宿主机中。
exit即可退出虚拟终端。
同时按三个键,ctrl+p+q 容器依然存在。
启动容器时要指定名称
容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以自定义设置名字,注意每个容器的名称要唯一。
设置容器内的名称
docker run -it -h cxk centos:7 bash
定义容器系统的主机名。
二、查看容器状态
docker ps [OPTIONS]
选项 | 作用 |
---|---|
-a, --all | 显示所有容器,包括已停止的容器;ps只显示正在运行的容器。 |
-q, --quiet | 只显示容器的数字 ID。 |
-s, --size | 显示容器使用的总文件大小。 |
-f, --filter filter | 根据提供的条件过滤输出。 |
-l, --latest | 显示最新创建的容器,只返回一个容器。 |
-n, --last int | 显示最后创建的 n 个容器,默认值为-1,表示显示所有容器。 |
查看容器内的进程
docker top CONTAINER [ps OPTIONS]
查看容器资源使用情况
docker stats [OPTIONS] [CONTAINER...]
动态查询单个容器资源使用情况。
查看所有,并且只运行一次。
docker stats --no-stream
查看容器的详细信息
docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等。
选项:
-f ,–format 选择性的查看。
-s,–size 容器总体文件的大小。
docker inspect c7cd896e7401
docker inspect -f "{{.NetworkSettings.IPAddress}}" c7cd896e7401
选择性查看信息,注意选择关键词。
三、容器相关操作
删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
-f, --force 强制删除正在运行的容器
-v, --volumes 删除与容器关联的匿名卷
docker container prune [OPTIONS]
用于删除所有已经停止的容器。
--filter
提供过滤条件来选择要删除的容器
docker container prune --filter "until=24h"(删除24小时前创建的已停止容器)
-f, --force
不提示确认,直接执行删除操作
docker container prune -f
删除所有已停止的容器,不需要确认。
docker rm $(docker ps -a -q -f status=exited)
删除状态为退出的容器。
容器的开启和停止
docker start|stop|restart|pause|unpause 容器ID
进入容器
attach
docker attach 容器名,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后,容器自动关闭,不推荐使用,需要进入到有shell环境的容器。
exec
在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式。
选项 | 含义 |
---|---|
-d, --detach | 在后台运行命令。 |
-e, --env list | 设置环境变量。 |
-i, --interactive | 与正在运行的命令进行交互。 |
-t, --tty | 分配一个伪 TTY(终端)。 |
暴露容器的端口
容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化。
docker run -d -P --name web1 httpd
指定端口映射
docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口。
注意:多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同。
方式1:
容器80端口映射宿主机本地随机端口。注意这边是小写的p
docker run -p 80 --name web2 nginx
方式2:
容器80端口映射到宿主机本地端口81
注意前面的端口是宿主机的端口号
docker run -p 81:80 --name web1 nginx
方式3:
宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name web1 nginx
方式4:
宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始。
docker run -p 192.168.232.10::80 --name web1 httpd
方式5:
docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name web1 nginx
修改已经创建的容器端口映射关系
将容器的端口号和宿主机之间的端口号做上对应关系。
去真机上寻找对应的容器文件。
停止docker程序
然后到对应的容器文件,修改hostconfig.json文件。
PortBindings":{“80/tcp”:[{“HostIp”:“”,“HostPort”:“80”}]}
PortBindings后80/tcp对应的是容器内部的80端口,HostPort对应的是映射到宿主机的端口80 。
查看容器的日志
docker logs可以查看容器中运行的进程在控制台输出的日志信息。
docker logs [OPTIONS] CONTAINER
选项 | 含义 |
---|---|
–details | 显示提供给日志的额外详细信息。 |
-f, --follow | 跟踪日志输出。 |
–since string | 显示自某个时间戳以来的日志(“2013-01-02T13:23:37”)或者相对时间(“42m”42分钟前) |
–tail string | 仅显示日志末尾的指定行数。 |
-t, --timestamps | 显示时间戳。 |
–until string | 显示直到某个时间戳为止的日志。 |
传递运行命令
容器需要有一个前台运行的进程才能保持容器的运行,通过传递运行参数是一种方式,另外也可以在构建镜像的时候指定容器启动时运行的前台命令容器里的PID为1的守护进程的实现方式:
- 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
- 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不必要的磁盘IO。
运行系统类的容器是不可以持久化,会自动退出。
需要在运行时加入一些前台执行的命令,那么就可以持久执行。
docker run -d alpine tail -f /etc/hosts
容器内部的hosts文件
容器会自动将容器的ID加入自己的/etc/hosts文件中,并解析成容器的IP。
人为的修改hosts文件
docker run -it --rm (当容器退出时会自动删除容器) --name a1 --add-host www.cxk.com:6.6.6.6 --add-host www.wyf.com:9.9.9.9 alpine
指定容器的DNS
容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址。
- 在容器启动时加选项 --dns=x.x.x.x
- 在/etc/docker/daemon.json 文件中指定
可以在真机的文件中搜索修改配置/etc/docker/daemon.json 。
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://23b9pwsw.mirror.aliyuncs.com"],
"dns" : [ "114.114.114.114", "1.1.1.1" ],
"dns-search": [ "kcg.com" , "kgc.org" ]
}
重启docker后可用。
容器内和宿主机之间复制文件
可以相互传递。
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
选项:
-a, --archive,保留所有权限复制
-L, --follow-link,复制软连接
docker cp 7096e39773a2:/etc/hosts
docker cp -a /data/ls 7096e39773a2:/
使用systemd控制容器运行(了解)
[root@ubuntu2204 ~]#cat /lib/systemd/system/hello.service
[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox-hello
ExecStartPre=-/usr/bin/docker rm busybox-hello
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox-hello busybox /bin/sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop=/usr/bin/docker kill busybox-hello
[Install]
WantedBy=multi-user.target
[root@ubuntu2204 ~]#systemctl daemon-reload
[root@ubuntu2204 ~]#systemctl enable --now hello.service