Docker基本操作

一、容器

1.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以后的内核才支持)

5.Namespace

一个宿主机运行了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 提供进程所属的控制组的身份隔离   Linux4.6

6.Control groups

如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码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 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率

7.容器 runtime

runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境

runtime 类型:

  •  runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范

低级容器运行时与高级容器运行时

  • High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。

  • Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc

三、安装Docker

1.安装依赖包

yum install -y yum-utils device-mapper-persistent-data lvm2 
软件作用
yum-utils: 提供了 yum-config-manager 工具
device mapper: 是Linux内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。
device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

2.设置阿里云镜像源

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#下载yum仓库

3.安装docker

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 它负责管理容器的生命周期,包括容器的创建、运行、暂停、继续和销毁等

四、docker操作

1.docker程序环境

环境配置文件

/etc/sysconfig/docker-network
/etc/sysconfig/docker-storage
/etc/sysconfig/docker

Unit File

/usr/lib/systemd/system/docker.service

docker-ce 配置文件

/etc/docker/daemon.json

Docker Registry配置文件

/etc/containers/registries.conf

2.基础操作

查看docker 版本

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信息

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

docker 配置文件

 位置:/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 旧名称 新名称 修改镜像的 标签 docker tag nginx:latest lucky/nginx:1.25

搜索镜像

官方网站进行镜像的搜索

官网: 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  容器后台运行

2.设置容器退出后启动规则

policy说明
no 默认的重启策略,不管容器是正常退出还是异常退出,总是不重启容器。
on-failure[:max-retries] 只在容器异常退出时重启容器。可选的 max-retries 参数指定重试的最大次数。
always 不管容器是正常退出还是异常退出,总是重启容器
unless-stopped 总是重启容器,但不考虑docker服务端启动时就已经退出的容器
docker run -d --restart always httpd

在使用 Docker 中的 --restart=always 选项时,容器将会在任何情况下都尝试自动重启,包括以下情况:

  1. 容器异常退出(非正常退出): 如果容器的主进程以非零状态退出(即错误退出),Docker 将自动尝试重新启动容器。

  2. Docker 守护进程重启: 当 Docker 守护进程重启(例如服务器重启或 Docker 服务重新启动),所有具有 --restart=always 选项的容器也将被重新启动。

  3. 手动停止容器: 即使手动使用 docker stop 命令停止了容器,使用 --restart=always 的容器也会被 Docker 自动重新启动。

虽然 --restart=always 选项会尝试在大多数情况下重新启动容器,但有一些特定情况下容器可能不会被重启,例如:

  • 手动删除容器: 如果你手动使用 docker rm 命令删除了容器,那么 --restart=always 选项将不再适用,因为容器已经从 Docker 中移除。

  • 宿主机系统重启或关机: 当宿主机操作系统因为重启或关机而停止时,Docker 服务及其管理的容器也会停止,此时 --restart=always 的设置无法保证容器能够立即重启,需要等待 Docker 服务重新启动后才能生效。

3.启动容器时指定名称

容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以自定义设置名字

注意每个容器的名称要唯一

docker  run -it --name hx httpd

4.设置容器内的名称

docker  run -it -h 0730 centos:7 

5.测试容器,退出容器删除

docker run --rm -it centos:7 bash 

6.查看容器的状态

命令作用
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)

7.删除容器

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

8.容器开启停止

docker start|stop|restart|pause|unpause 容器ID

9.进入容器

attach

docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭不推荐使用,需要进入到有shell环境的容器

例子:

docker  attach   b92e987b5d15

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

例子: 一次性操作

[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.暴露容器的端口

暴露随机端口

容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化

-P , --publish-all= true | false默认为false

#示例:
docker run -P nginx:latest  #映射容器所有暴露端口至随机本地端口

 docker port 可以查看容器的端口映射关系

#格式
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

11.容器内部的hosts 文件(域名解析)

容器会自动将容器的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

12.指定DNS(服务器)

容器的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 

13.容器内和宿主机之间复制文件

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:/

14.容器传递参数

有些容器运行时,需要传递变量,可以使用 -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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2024-07-31 13:56  hx_ky36  阅读(3)  评论(0编辑  收藏  举报