docker容器基础详解

 容器命令

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值