Docker基本操作
一、容器
操作系统的的组成
-
Bootloader:它负责设备的启动过程。
-
Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
-
Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
-
Desktop Environment:这是用户通常与之交互的环境。
-
Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
-
Applications: 这些是执行不同用户任务(例如word,excel等)的程序集。
-
Daemons : 后台服务提供商。
什么是内核kernel
内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。
每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。
内核的任务
-
用于应用程序执行的流程管理。
-
内存和I / O(输入/输出)管理。
-
系统调用控制(内核的核心行为)。
-
借助设备驱动程序进行设备管理。
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
-
-
容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化
-
二、Docker
1.什么是docker
Docker是一个开源的应用容器引擎,基于go语言开发,用于运行容器里的应用。
Docker也可以作为管理容器和镜像的一种工具。
2.Docker和虚拟机的区别
Docker容器 | 虚拟机 | |
特性 | 所有容器共享宿主机内核 | 每个虚拟机都有独立的操作系统和内核 |
隔离性 | 通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量 | 完全隔离,每个虚拟机都有独立的硬件资源 |
启动速度 | 秒级启动速度 | 分钟级启动速度 |
性能损耗 | 容器相当于宿主机的进程,性能几乎没有损耗 | 需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,至少有20%~50%的性能损耗 |
系统支持量(单机) | 单机容量能够支持成百上千个容器 | 单机容量最多支持几十个虚拟机 |
3.Docker核心概念
Docker有三个核心概念:镜像、容器和仓库。
镜像
镜像是创建容器的基础。
镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)
容器
容器是用镜像运行的实例。
容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的。
仓库
仓库是用来保存镜像的地方。
仓库有公有仓库和私有仓库之分。
4.Linux中的namespace( 命名空间)
六个命名空间和隔离内容
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
NETWORK | CLONE_NEWNET | 网络设备、网络栈、端口等 |
MOUNT | CLONE_NEWNS | 挂载点(文件系统) |
USER | CLONE_NEWUSER | 用户和用户组(3.8以后的内核才支持) |
一个宿主机运行了N个容器,多个容器共用一个 OS,必然带来的以下问题:
-
怎么样保证每个容器都有不同的文件系统并且能互不影响?
-
一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进程?各个容器子进程间能相互通信(内存数据)吗?
-
每个容器怎么解决IP及端口分配的问题?
-
多个容器的主机名能一样吗?
-
每个容器都要不要有root用户?怎么解决账户重名问题
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:
功能 | 系统调用参数 | 内核版本 | |
---|---|---|---|
MNT Namespace(mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 |
IPC Namespace(Inter-Process Communication) | 提供进程间通信的隔离能力,包括信号量,消息队列和共享内存 | CLONE_NEWIPC | 2.6.19 |
UTS Namespace(UNIXTimesharing System) | 提供内核,主机名和域名隔离能力 | CLONE_NEWUTS | 2.6.19 |
PID Namespace(ProcessIdentification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 |
Net Namespace(network) | 提供网络隔离能力,包括网络设备,网络栈,端口等 | CLONE_NEWNET | 2.6.29 |
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 |
TimeNamespace | 提供时间隔离能力 | CLONE_NEWTIME | 5.6 |
syslogNamespace | 提供syslog隔离能力 | syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能 | |
Controlgroup(cgroup)Namespace | 提供进程所属的控制组的身份隔离 |
如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等
Cgroups 最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如:将进程挂起和恢复等操作)
cgroups 具体实现
-
blkio: 块设备IO限制
-
cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问
-
cpuacct: 产生 cgroup 任务的 cpu 资源报告
-
cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
-
devices: 允许或拒绝 cgroup 任务对设备的访问
-
freezer: 暂停和恢复 cgroup 任务
-
memory: 设置每个 cgroup 的内存限制以及产生内存资源报告
-
net_cls: 标记每个网络包以供 cgroup 方便使用
-
ns: 命名空间子系统
-
perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程
Docker
相当于增强版的LXC,功能更为强大和易用,也是当前最主流的容器前端管理工具Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
pouch
Pouch (小袋子)起源于 2011 年,并于2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率
- runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范
低级容器运行时与高级容器运行时
-
High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
-
Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc
三、安装Docker
yum install -y yum-utils device-mapper-persistent-data lvm2
软件 | 作用 |
---|---|
yum-utils: | 提供了 yum-config-manager 工具 |
device mapper: | 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。 |
device mapper |
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #下载yum仓库
yum install -y docker-ce docker-ce-cli containerd.io # 此处安装最新版 如果不想安装最新版 yum list --help #可以使用帮助查看 yum list --showduplicates docker-ce #查看所有的可用版本 yum -y install docker-ce-19.03.15-3.el7 docker-ce-cli-19.03.15-3.el7 containerd.io
作用 | |
---|---|
docker-ce(Docker Community Edition) | 这是 Docker 的社区版。Docker 社区版是免费的, 面向开发者、小型团队和个人使用。它包含了 Docker Engine, 这是一个用于构建和运行容器的开源容器运行时。 |
docker-ce-cli(Docker Command Line Interface) | 这是 Docker 的命令行工具, 它允许用户与 Docker Engine 交互,执行容器相关的操作。 通过 Docker CLI,用户可以构建、运行、管理和发布容器。 |
containerd.io |
/etc/sysconfig/docker-network /etc/sysconfig/docker-storage /etc/sysconfig/docker
/usr/lib/systemd/system/docker.service
/etc/docker/daemon.json
/etc/containers/registries.conf
docker version Client: Docker Engine - Community Version: 26.1.4 API version: 1.45 Go version: go1.21.11 Git commit: 5650f9b Built: Wed Jun 5 11:32:04 2024 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 26.1.4 API version: 1.45 (minimum version 1.24) Go version: go1.21.11 Git commit: de5c9cf Built: Wed Jun 5 11:31:02 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.33 GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957 runc: Version: 1.1.12 GitCommit: v1.1.12-0-g51d5e94 docker-init: Version: 0.19.0 GitCommit: de40ad0
docker info Client: Docker Engine - Community Version: 26.1.4 Context: default Debug Mode: false Plugins: buildx: Docker Buildx (Docker Inc.) Version: v0.14.1 Path: /usr/libexec/docker/cli-plugins/docker-buildx compose: Docker Compose (Docker Inc.) Version: v2.27.1 Path: /usr/libexec/docker/cli-plugins/docker-compose Server: Containers: 2 # 容器数量 Running: 0 Paused: 0 Stopped: 2 Images: 4 # 镜像数量 Server Version: 26.1.4 # server 版本 Storage Driver: overlay2 #docker 使用的是 overlay2 文件驱动 Backing Filesystem: xfs ## 宿主机上的底层文件系统 Supports d_type: true Using metacopy: false Native Overlay Diff: true userxattr: false Logging Driver: json-file Cgroup Driver: cgroupfs # Cgroups 驱动 Cgroup Version: 1 Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog Swarm: inactive Runtimes: io.containerd.runc.v2 runc Default Runtime: runc Init Binary: docker-init containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957 runc version: v1.1.12-0-g51d5e94 init version: de40ad0 Security Options: seccomp Profile: builtin Kernel Version: 3.10.0-693.el7.x86_64 # 宿主机的相关信息 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 4 Total Memory: 1.781GiB Name: localhost.localdomain ID: 39eee203-7863-4c80-a955-9aef575138c1 Docker Root Dir: /var/lib/docker # docker 数据存储目录 Debug Mode: false Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://6ijb8ubo.mirror.aliyuncs.com/ # registry 地址 Live Restore Enabled: false
位置:/etc/docker/daemon.json
#镜像加速下载 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://n8lnq9bb.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
命令 | 含义 | 例子 |
---|---|---|
docker --help | 查看帮助 | |
docker image --help | 查看镜像帮助 | docker image --help |
docker search 镜像名称 | 搜索相关镜像 | docker search nginx |
docker pull 镜像名称:标签 | 下载镜像(不加标签默认使用latest) | docker pull nginx |
docker images | 查看所有已有镜像 | docker images |
docker images 镜像名称 | 查看单个镜像 | docker images nginx |
docker inspect 镜像ID | 查看镜像的详细信息 | docker inspect 56b21e040954 |
docker tag 旧名称 新名称 | 修改镜像的 标签 |
搜索镜像
官方网站进行镜像的搜索
官网: http://hub.docker.com
1.搜索镜像
#格式
docker search 关键字
docker search nginx
#NAME: 列出了搜索结果中各个镜像的名称。
#DESCRIPTION: 描述了每个镜像的简要说明或介绍。
#STARS: 显示了每个镜像的星级评分或受欢迎程度。星级数量越高表示该镜像的受欢迎程度越高。
#OFFICIAL: 表示是否是官方构建的镜像,OK表示是官方构建的。
#AUTOMATED: 表示是否是自动构建的镜像,这个字段没有值表示不是自动构建的。
2.获取镜像
#格式
docker pull 仓库名称[:标签]
#如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest 标签。
3.查看镜像信息
镜像下载后存放在 /var/lib/docker
。
Docker 相关的本地资源存放在 /var/lib/docker/ 目录下,其中 containers 目录存放容器信息,image 目录存放镜像信息,overlay2 目录下存放具体的镜像底层文件。
查看下载的镜像文件信息
cat /var/lib/docker/image/overlay2/repositories.json
查看下载到本地的所有镜像
docker images
获取镜像详细信息
根据镜像的唯一标识 ID 号(IMAGE ID)获取。
#格式
docker inspect 镜像ID号
●lowerdir是镜像层,目录或者文件是只读的,其实就是rootfs,image layer可以分很多层,所以对应的lowerdir是可以有多个目录
●upperdir是在lowerdir之上的容器层,这层是可读可写的,在启动一个容器时候会进行创建,所有的对容器数据更改都发生在这里层
●MergedDir是表现层,是容器的挂载点
为本地的镜像添加新的标签
#格式
docker tag 名称:[标签] 新名称:[新标签]
删除镜像
注意:如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
#格式
#方式一
docker rmi 仓库名称:标签 #当一个镜像有多个标签时,只是删除其中指定的标签
#方式二
docker rmi 镜像ID号 #会彻底删除该镜像
#举个例子,删除标签web
docker rmi nginx:latest
4.存出和载入镜像
保存镜像
将镜像保存为本地文件。
#格式
docker save -o 存储文件名 存储的镜像
docker save -o /data/nginx nginx:latest #存出镜像命名为nginx存在当前目录下
载入镜像
将镜像文件导入到镜像库中。
#格式 #方式一 docker load < 存出的文件 #方式二 docker load -i 存出的文件
docker load < /data/nginx
上传镜像
将镜像上传到阿里仓库,需要注册账号
https://cr.console.aliyun.com/cn-hangzhou/instances
六、Docker 容器操作
1.创建并启动容器 -----docker run命令
帮助: man docker-run
可以直接执行 docker run
命令, 等同于先执行 docker create 命令,再执行 docker start 命令。
注意:容器是一个与其中运行的 shell 命令/进程共存亡的终端,命令/进程运行容器运行, 命令/进程结束容器退出。
#基本格式 docker run -d [选项] 镜像名:标签 [容器启动命令] #常用选项 -d:以后台模式运行容器。 -i:--interactive: 这个选项使得容器的标准输入保持打开状态
-t:--tty: 这个选项分配一个伪终端(pseudo-TTY)给容器。
-h:设置容器内的名称
--name:为容器指定一个名称。 -p:将容器的端口映射到主机上的特定端口。 -P:随机端口映射 -v:将主机上的目录或文件挂载到容器中。 -e:设置容器的环境变量。 --rm:容器停止后自动删除。 --network:指定容器要使用的网络。 --link:将容器链接到另一个容器。
同时按三个键,ctrl+p+q 容器后台运行
说明 | |
---|---|
no | 默认的重启策略,不管容器是正常退出还是异常退出,总是不重启容器。 |
on-failure[:max-retries] | 只在容器异常退出时重启容器。可选的 max-retries 参数指定重试的最大次数。 |
always | 不管容器是正常退出还是异常退出,总是重启容器 |
unless-stopped | 总是重启容器,但不考虑docker服务端启动时就已经退出的容器 |
docker run -d --restart always httpd
在使用 Docker 中的 --restart=always
选项时,容器将会在任何情况下都尝试自动重启,包括以下情况:
-
容器异常退出(非正常退出): 如果容器的主进程以非零状态退出(即错误退出),Docker 将自动尝试重新启动容器。
-
Docker 守护进程重启: 当 Docker 守护进程重启(例如服务器重启或 Docker 服务重新启动),所有具有
--restart=always
选项的容器也将被重新启动。 -
手动停止容器: 即使手动使用
docker stop
命令停止了容器,使用--restart=always
的容器也会被 Docker 自动重新启动。
虽然 --restart=always
选项会尝试在大多数情况下重新启动容器,但有一些特定情况下容器可能不会被重启,例如:
-
手动删除容器: 如果你手动使用
docker rm
命令删除了容器,那么--restart=always
选项将不再适用,因为容器已经从 Docker 中移除。 -
宿主机系统重启或关机: 当宿主机操作系统因为重启或关机而停止时,Docker 服务及其管理的容器也会停止,此时
--restart=always
的设置无法保证容器能够立即重启,需要等待 Docker 服务重新启动后才能生效。
注意每个容器的名称要唯一
docker run -it --name hx httpd
docker run -it -h 0730 centos:7
docker run --rm -it centos:7 bash
作用 | |
---|---|
docker ps | 查看容器的状态(看不到退出的,可以看到运行的) |
docker ps -a | 查看容器的状态 包括退出的 , 和运行的 |
docker ps -a -s | 查看容器的状态 -s 查看容器的大小 |
docker ps -l | 查看最近的一个容器状态 |
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)
#显示退出状态的容器 #-f的大部分选项只能看启动的容器 docker ps -f status=exited
docker top cb
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 stats cbd84392fac4
#查看所有容器,并且只运行一次
docker stats --no-stream
#查看容器 docker ps -q #查看镜像 docker images
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 for2 minutes)
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
docker start|stop|restart|pause|unpause 容器ID
例子:
docker attach b92e987b5d15
在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用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
例子: 一次性操作
[root@ubuntu2204 ~]#docker run -idt --name c7-1 centos:7 4a965b518c1c64b2958fa574b48b39406e0cee808f171187a1a7a4b28b98c417 [root@ubuntu2204 ~]#docker exec c7-1 cat /etc/passwd root:x:0:0:root:/root:/bin/bash
例子: 持久操作
[root@ubuntu2204 ~]#docker exec -it c7-1 sh sh-4.2# sh-4.2# sh-4.2#
10.
-P , --publish-all= true | false默认为false #示例: docker run -P nginx:latest #映射容器所有暴露端口至随机本地端口
#格式
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
docker run -p 可以将容器的预定义的指定端口映射到宿主机的相应端口
注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同
方式1: 容器80端口映射宿主机本地随机端口
docker run -p 80 --name nginx-test-port1 nginx
方式2: 容器80端口映射到宿主机本地端口81
docker run -p 81:80 --name nginx-test-port2 nginx
方式3: 宿主机本地IP:宿主机本地端口:容器端口
docker run -p 10.0.0.100:82:80 --name nginx-test-port3 nginx
方式4: 宿主机本地IP:宿主机本地随机端口:容器端口,默认从32768开始
docker run -p 10.0.0.100::80 --name nginx-test-port4 nginx
方式5: 宿主机本机ip:宿主机本地端口:容器端口/协议,默认为tcp协议
docker run -p 10.0.0.100:83:80/udp --name nginx-test-port5 nginx
方式6: 一次性映射多个端口+协议
docker run -p 8080:80/tcp -p 8443:443/tcp -p 53:53/udp --name nginx-test-port6 nginx
容器会自动将容器的ID加入自已的/etc/hosts文件中,并解析成容器的IP
例子: 一次性查看主机名
docker run --rm alpine cat /etc/hosts
例子: 进入到容器中 查看主机名
docker run -d alpine tail -f /etc/hosts docker exec -it 1cb sh / # cat /etc/hosts
例子: 人为的修改 hosts 文件 --add-host 添加指定信息
docker run -it --rm --name a1 --add-host www.hx.com:6.6.6.6 --add-host www.ky36.com:9.9.9.9 alpine
容器的dns服务器,默认采用宿主机的dns 地址,可以用下面方式指定其它的DNS地址
将dns地址配置在宿主机
-
在容器启动时加选项 --dns=x.x.x.x
-
在/etc/docker/daemon.json 文件中指定
例子: 指定容器的dns
docker run -it --rm --dns 1.1.1.1 --dns 2.2.2.2 centos bash
例子: 配置文件指定DNS和搜索domain名
vim /etc/docker/daemon.json { "registry-mirrors": ["https://n8lnq9bb.mirror.aliyuncs.com"], "dns" : [ "114.114.114.114", "1.1.1.1" ], "dns-search": [ "kcg.com" , "kgc.org" ] }
systemctl restart docker docker run -it --rm centos:7 bash cat /etc/resolv.conf
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
docker cp 7096e39773a2:/etc/hosts /data/ docker cp -a /data/ls 7096e39773a2:/
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
范例: 传递变量创建MySQL
变量参考链接: https://hub.docker.com/_/mysql
docker run -d --name m1 mysql:5.7.29 docker run --name m2 mysql:5.7.29 docker run --name m1 -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.29 # 运行容器, 添加属性 apt install mysql-client -y #安装客户端工具 mysql -uroot -p123456 -h127.0.0.1 mysql> select user,host from mysql.user;
准备变量文件
cat mysql/mysql-test.cnf [mysqld] server-id=100 log-bin=mysql-bin [root@ubuntu1804 ~]#cat env.list MYSQL_ROOT_PASSWORD=123123 MYSQL_DATABASE=wordpress MYSQL_USER=wpuser MYSQL_PASSWORD=wppass docker run --name m2 --env-file=env.list -d -p 3307:3306 mysql:5.7.29 mysql -uroot -p -h127.0.0.1 -P3307 docker port m2 3306/tcp -> 0.0.0.0:3307 3306/tcp -> [::]:3307
、
、