容器命令
1.启动容器和停止容器
docker run
docker run [选项] [镜像名] [shell命令] [参数]
#选项:
-i, --interactive Keep STDIN open even if not attached,通常和-t一起使用
-t, --tty 分配pseudo-TTY,通常和-i一起使用,注意对应的容器必须运行shell才支持进
入
-d, --detach Run container in background and print container ID,台后运行,
默认前台
--name string Assign a name to the container
--h, --hostname string Container host name
--rm Automatically remove the container when it exits
-p, --publish list Publish a container's port(s) to the host
-P, --publish-all Publish all exposed ports to random ports
--dns list Set custom DNS servers
--entrypoint string Overwrite the default ENTRYPOINT of the image
--restart policy
--privileged Give extended privileges to container
-e, --env=[] Set environment variables
--env-file=[] Read in a line delimited file of environment variables
--sysctl net.ipv4.ip_unprivileged_port_start=0 #指定容器的内核参数,但不修改宿主机内核
--ulimit ulimit #指定ulimit限制配置,比如: --ulimit nofile=10240:10240
[shell命令] [参数] #使用指定的命令和参数,替换容器默认的命令
--restart可以指定不同的policy
如果docker stop 停止容器后重启宿主机。always选项以外的其它选项的容器都不会随着宿主机启动而自动启动
容器启动后,如果容器内没有前台运行的进程,将自动退出停止
容器需要一个前台运行的进程才能保持容器的进行,可以在构建镜像的时候指定容器启动时运行的前台命令,也可以通过启动时传递参数实现
容器里的PID为1的守护进程的实现方式
- 服务类: 如: Nginx,Tomcat,Apache ,但服务不能停
- 命令类: 如: tail -f /etc/hosts ,主要用于测试环境,注意: 不要tail -f <服务访问日志> 会产生不 必要的磁盘IO
从容器内退出,并停止容器:exit
从容器内退出,并不停止容器:ctrl+p+q
指定容器名称:--name
运行交互式容器并退出:docker run -it docker.io/busybox sh
一次性运行容器,退出后立即删除,用于测试:docker run --rm alpine cat /etc/issue
--privileged 选项
容器里的root和宿主机的root不是一个东西。容器里的root是个假root,并不具备真正的root管理员权限,使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。privileged启动的容器,可以看到很多host上 的设备,并且可以执行mount。甚至允许你在docker容器中启动docker容器。
格式:
docker start|stop|restart|pause|unpause 容器ID
批量正常启动或关闭所有容器
docker start $(docker ps -a -q)
docker stop $(docker ps -a -q)
暂停和恢复容器
docker pause
docker unpause
2.查看容器
docker ps [OPTIONS]
docker container ls [OPTIONS]
选项:
-a, --all Show all containers (default shows just running)
-q, --quiet Only display numeric IDs
-s, --size Display total file sizes
-f, --filter filter Filter output based on conditions provided
-l, --latest Show the latest created container (includes all states)
-n, --last int Show n last created containers (includes all states) (default -1)
--format 按格式输出信息
docker ps
docker ps --format 命令中,你可以使用不同的占位符来指定要在输出中显示的容器信息。
#以下是一些常用的占位符:
{{.ID}}:容器的ID。
{{.Image}}:容器使用的映像名称。
{{.Command}}:容器的启动命令。
{{.CreatedAt}}:容器的创建时间。
{{.RunningFor}}:容器运行的时间。
{{.Ports}}:容器的端口映射信息。
{{.Status}}:容器的状态。
{{.Size}}:容器的大小。
{{.Names}}:容器的名称。
{{.Label}}:容器的标签。
#示例
docker ps --format "{{.ID}}\t{{.Image}}\t{{.Status}}"
查看容器内的进程
docker top CONTAINER [ps OPTIONS]
查看容器资源使用情况
docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output
查看容器的详细信息
docker inspect 可以查看docker各种对象的详细信息,包括镜像,容器,网络等
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
3.删除容器
docker rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
#选项:
-f, --force Force the removal of a running container (uses SIGKILL)
-v, --volumes Remove the volumes associated with the container
#删除停止的容器
docker container prune [OPTIONS]
Options:
--filter filter Provide filter values (e.g. 'until=<timestamp>')
-f, --force Do not prompt for confirmation
删除所有容器
[root@ubuntu1804 ~]#docker rm -f `docker ps -a -q`
[root@ubuntu1804 ~]#docker ps -a -q | xargs docker rm -f
删除指定状态的容器
[root@ubuntu2204 ~]#docker rm -f `docker ps -q -f status=running`
[root@ubuntu1804 ~]#docker rm `docker ps -qf status=exited`
4.发信号
docker kill 可以给容器发信号,默认为SIGKILL,即9信号
docker kill [OPTIONS] CONTAINER [CONTAINER...]
#选项:
-s, --signal string Signal to send to the container (default "KILL")
5.进入正在运行的容器
attach
attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此 方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,
docker attach [OPTIONS] CONTAINER
exec
在运行中的容器启动新进程,可以执行单次命令,以及进入容器 测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:
-d, --detach Detached mode: run command in the background
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
#常见用法
docker exec -it 容器ID sh|bash
6.端口
docker run -P
-P , --publish-all= true | false默认为false
#示例:
docker run -P docker.io/nginx #映射容器所有暴露端口至随机本地端口
docker port可以查看容器的端口映射关系
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
自动生成iptables
[root@centos7 ~]#iptables -vnL -t nat
端口映射的本质就是利用NAT技术实现
7.查看日志
docker logs可以查看容器中运行的进程在控制台的标准输出和标准错误,一般对应是日志信息
docker 日志是存放在宿主机的 /var/lib/docker/containers//-json.log文 件中
docker logs [OPTIONS] CONTAINER
选项:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or
relative (e.g. 42m for 42 minutes)
--tail string Number of lines to show from the end of the logs (default
"all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or
relative (e.g. 42m for 42 minutes)
[root@kv1 docker]#docker run -d alpine /bin/sh -c 'i=1;while true;do echo hello$i;let i++;sleep 2;done'
2624b0bfb0bdf43293b0846e032ba719207b46a8fbbc74b0b0b9c97e2b4c7f02
[root@kv1 docker]#docker logs 2624
hello1
hello2
hello3
hello4
hello5
hello6
[root@kv1 docker]#docker logs --tail 4 2624
hello10
hello11
hello12
hello13
#显示时间
[root@kv1 docker]#docker logs --tail 1 -t 2624
2024-04-11T11:35:25.600679861Z hello42
#查看磁盘文件
[root@kv1 containers]#find ./ -name *.log |grep -r hello130
find ./ -name *.log |xargs grep hello130
8.容器内部的hosts文件和DNS
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP
[root@kv1 docker]#docker exec -it cf678c96c896 sh
/ #
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.4 cf678c96c896
docker run -it --rm --add-host www.yaya.com:6.6.6.6 --add-host www.yaya.org:8.8.8.8 peaceful_chatterjee
指定DNS
容器的dns服务器,默认使用宿主机的dns服务
- 修改宿主机的DNS地址址配置
- 在容器启动时加选项--dns=x.x.x.x
- 在/etc/docker/daemon.json 文件中指定
容器的DNS默认从宿主机的DNS获取
指定DNS地址
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 centos bash
指定domain名
[root@ubuntu1804 ~]#docker run -it --rm --dns 1.1.1.1 --dns 8.8.8.8 --dns-search a.com --dns-search b.com busybox
配置文件
[root@ubuntu1804 ~]#cat /etc/docker/daemon.json
{
"storage-driver": "overlay2",
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"],
"dns" : [ "114.114.114.114", "119.29.29.29"],
"dns-search": [ "magedu.com", "wang.org"]
}
#用--dns指定优先级更高
9.复制
不论容器的状态是否运行,复制都可以实现
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH
复制容器的文件到宿主机
[root@ubuntu2004 ~]#docker run -it --name b1 busybox sh
[root@ubuntu2004 ~]#docker cp b1:/bin/busybox /usr/local/bin/
[root@ubuntu2004 ~]#busybox ls
10.传递环境变量
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
docker run --name mysql-test1 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=123456 -d -p 3306:3306 mysql:5.7.30
11.清除不再使用的数据
[root@ubuntu1804 ~]#docker system prune
#清除不再使用的镜像
[root@ubuntu1804 ~]#docker system prune -f -a
12.导出和导入容器
docker export
docker import
docker export和docker save都可以用于将 Docker 的容器/镜像导出到本地文件系统,但是它们 用途和效果是不同的: docker export:此命令是用于将一个运行的或者停止的容器的文件系统导出为一个 tar 归档文件。需 要注意的是, docker export不会包含该容器的历史(也就是每个层的变更),并且也不会包含容器 的环境变量、元数据和其他相关的配置信息。这意味着如果你导入一个用docker export导出的 tar 文件并运行,你得到的将是一个新的、干净的容器,没有之前容器的运行历史和配置。 docker save:此命令用于将一个或多个镜像导出为一个 tar 归档文件。与docker export不同, docker save会完整地保存镜像的所有内容,包括每一层的变更、所有的元数据、所有的标签等。这 意味着如果你导入一个用docker save导出的 tar 文件并运行,你得到的将是一个与原镜像完全一样 的新镜像,包括所有的历史和配置。 总结来说, docker export是用来导出容器的文件系统,而docker save是用来导出镜像的全部内 容。
[root@ubuntu2204 ~]#docker export nginx -o nginx.tar
[root@ubuntu2204 ~]#tar tvf nginx.tar |head
-rwxr-xr-x 0/0 0 2022-07-06 17:45 .dockerenv
drwxr-xr-x 0/0 0 2021-12-20 08:00 bin/
-rwxr-xr-x 0/0 1234376 2021-08-05 04:25 bin/bash
-rwxr-xr-x 0/0 43936 2020-09-24 16:36 bin/cat
-rwxr-xr-x 0/0 72672 2020-09-24 16:36 bin/chgrp
-rwxr-xr-x 0/0 64448 2020-09-24 16:36 bin/chmod
-rwxr-xr-x 0/0 72672 2020-09-24 16:36 bin/chown
-rwxr-xr-x 0/0 151168 2020-09-24 16:36 bin/cp
-rwxr-xr-x 0/0 125560 2020-12-10 21:23 bin/dash
-rwxr-xr-x 0/0 113664 2020-09-24 16:36 bin/date
#import 实现将容器文件生成镜像
[root@ubuntu2204 ~]#docker import nginx.tar nginx:test
[root@ubuntu2204 ~]#docker images nginx:test
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx test ca611fd77d08 6 minutes ago 140MB