专业编程基础技术教程

网站首页 > 基础教程 正文

Docker 必知必会的操作命令,真的很通俗易懂?

ccvgpt 2024-10-12 14:13:12 基础教程 8 ℃

一、基础概念

Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装,提供简单易用的容器使用接口。

解决难题:

Docker 必知必会的操作命令,真的很通俗易懂?

  • 环境配置不一致
  • 虚拟机累赘(资源占用大、启动慢等)

主要用途:

  • 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  • 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容,组建微服务架构。

当人们说 “Docker” 时,他们通常是指 Docker Engine,它是一个客户端-服务器应用程序, 由 Docker 守护进程、REST API、命令行接口(CLI)组成。

结构

  1. 客户端调用 Docker
  2. Docker 从 Registry 拉取镜像(image)
  3. 通过镜像生成容器(container)实例

镜像 image

Docker 把应用程序及其依赖,打包在 image 文件里面。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。

image 文件是通用的。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作。

容器container

容器是一个镜像的可运行的实例,可以使用 Docker REST API 或者 CLI 来操作容器,容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。

容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

注册表(仓库)registry

存放镜像的地方(公有/私有)

为了方便共享,image 文件制作完成后,可以上传到网上的仓库。Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库。

UnionFS 联合文件系统

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统。联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

镜像加载原理

Docker的镜像是由多层文件系统组成:

  • bootfs(boot file system)主要包含 bootloader 和 kernel。bootloader 主要是引导加载kernel,完成后整个内核就都在内存中了。此时内存的使用权已由bootfs转交给内核,系统卸载 bootfs。可以被不同的 Linux 发行版共用。
  • rootfs(root file system),包含典型Linux系统标准目录和文件。相当于各种不同操作系统发行版(Ubuntu,Centos等)。因为底层直接用 Host 的kernel,rootfs 只包含最基本的命令,工具和程序就可以了。当进行修改或者更新时,会在当前镜像层上新建新的层级。

二、安装

Ubuntu

1.设置 Docker apt 仓库

# 添加 Docker 官方 GPG 秘钥:

sudo apt-get update

sudo apt-get install ca-certificates curl

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc




# 添加 Apt 源到仓库:

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \

  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

2.安装 Docker 包

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

3.运行

sudo docker run hello-world

三、基本操作

基本信息

信息查看

# 显示docker的基本信息

$ docker version 

# 系统信息,镜像和容器的数量

$ docker info 




# 查看docker事件

$ docker events [OPTIONS]




# 全部帮助

$ docker --help 

# 个别命令帮助

$ docker [命令] --help

仓库 registry

docker search

# 搜索镜像

docker search [OPTIONS] 镜像名




# 相当于在 hub.docker.com 页面搜索




选项:

  -f,--filter filter 过滤输出

    --format string  格式化输出

    --limit int 最大搜索结果数(默认为25)

    --no-trunc 不截断输出




示例:

docker search mysql

docker login

# 登录到registry
docker login [OPTIONS] [SERVER]


常用选项:
 -p ,--password  密码
 -u ,--username  用户名


示例:
docker login
>输入账号
>输入密码


# 登录到私有registry
docker login localhost:8080
docker login -u username -p userpasswd 192.168.1.33:5000


# 注销
docker logout [SERVER]

镜像 image

docker images

docker images [OPTIONS] [REPOSITORY[:TAG]]

docker images = docker image ls




常用选项:

-a , --all   # 显示所有(默认隐藏中间图像)

--digests       # 显示摘要

-f , --filter filter # 过滤输出

--format string # 格式化输出

--no-trunc      # 不截断输出(ID缩写是12位,不截断输出就是64位)

-q , --quiet    # 只显示id




示例:




# 只显示ID

docker images -aq

docker pull

# 拉取镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]




# 默认仓库为docker.io/library/

# 默认版本为:latest

# 所以docker pull mysql 等价于 docker pull docker.io/library/mysql:latest

docker rmi

# 删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]




常用选项:

-f 强制删除图像




# 删除所有( linux 小技巧)

$ docker rmi -f $(docker images -aq)

# 或

$ docker images -qa | xargs docker rmi

docker import 与 export

# 导出镜像

docker export [OPTIONS] CONTAINER




常用选项:

-o,--output    写入文件,而不是STDOUT




例子:

docker export exampleimage > exampleimage.tar

# 或

docker export --output="exampleimage.tar" exampleimage

# 导入镜像

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]




常用选项:

-c, --change  将Dockerfile指令应用于创建的映像(支持的Dockerfile指令:CMD| ENTRYPOINT| ENV| EXPOSE| ONBUILD| USER| VOLUME|WORKDIR)

-m,--message  设置导入图像的提交消息

--platform  API 1.32+ ;如果服务器支持多平台,则设置平台




示例:




# 远程

docker import http://example.com/exampleimage.tgz




# 本地

docker import /path/to/exampleimage.tgz

# 或

cat exampleimage.tgz | docker import - exampleimagelocal:new




# 本地目录

sudo tar -c . | docker import - exampleimagedir

容器 container

基础操作

# 启动容器

docker start

# 重启容器

docker restart

# 停止容器

docker stop

# 杀掉容器

docker kill 




# 查看容器元数据(详细信息)

docker inspect 

# 查看内容占用

docker stats 

# 查看容器中的进程信息

docker top

docker ps

# 查看容器列表

docker ps [OPTIONS]

docker ps  = docker container ls




常用选项:

-a,--all   显示所有容器(默认显示正在运行)

-f,--filter    过滤输出

  --format  使用Go模板格式化输出

-n,--last  显示n个最后创建的容器

-l ,--latest  显示最新创建的容器

  --no-trunc  不要截断输出

-q, --quiet  仅显示容器ID

-s, --size   显示文件总大小

docker run

# 运行容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]




# run的时候如果本地没有镜像的话,会自动执行拉取操作




常用选项:

-d,--detach 在后台运行容器并打印容器ID

-e,-env list 设置环境变量

-h,--hostname string 容器主机名

  --mount mount 绑定卷

  --name string 分配名称

  --network 连接到网络

  --rm  退出时自动删除容器

-v,-volume list 映射卷

-p 指定容器的端口 如-p 8080:8080

例子:

 -p ip:主机端口:容器端口

 -p 主机端口:容器端口

 -p 容器端口




-i 交互式操作。

-t --tty 分配一个伪TTY连接终端

-m --memory bytes  内存限制

  --privileged 赋予最高权限(危,无限制,有主机权限)

  --restart string 重启策略,参数示例:

  --restart=always   自启

  --restart=on-failure:3  非正常退出 重试3次

  --restart=unless-stopped 不尝试启动




示例:

# 容器停止后自动删除

docker run --rm hello-world




# 后台运行并给它命名

docker run -itd --name uuu ubuntu




# run并且以终端模式进入该容器

docker run -it ubuntu /bin/bash

# 输入 exit 回车 停止并退出容器

# 或快捷键 Ctrl + P + Q 不停止容器的退出




# 运行并映射卷到主机

docker run -p 3306:3306 --name mysql -v "$(pwd)"/docker_v/mysql/conf:/etc/mysql/conf.d mysql

docker rm

# 删除容器

docker rm [OPTIONS] CONTAINER [CONTAINER...]




常用选项:

 -f, --force  强制删除正在运行的容器(使用SIGKILL)

 -l ,--link  删除指定的链接

 -v,--volumes   删除与容器关联的匿名卷




示例:

# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f

docker rm 容器id

# 删除所有容器

docker rm -f $(docker ps -aq)

# 删除所有容器

docker ps -a -q|xargs docker rm

docker logs

# 查看容器日志

docker logs [OPTIONS] CONTAINER




常用选项::

    --details 显示详细信息

  -f,--follow 跟随日志输出

    --since string 显示自时间戳

    --tail string 显示行数

  -t,--timestamps显示时间戳




例子:

docker logs

docker logs -f -t --tail 10 容器名或id

docker exec

# 连接容器终端(进入容器)

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]




# 也可以用 docker attach 进入容器终端




常用选项:

-d,--detach 在后台运行命令

-e,-env 环境变量

-i,--interactive 即使未连接STDIN仍保持打开状态(交互式操作)

-t,--tty分配伪TTY(终端)




# 同上面的run中操作一样,这一步可以在运行后进入到容器中,如:

docker exec -it uuu /bin/bash




# 区别

# docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)

# docker attach 进入容器正在执行的终端,不会启动新的进程

docker cp

# 拷贝容器中的文件

docker cp 容器名/id:容器内路径 主机文件路径




示例:

#拷贝容器数据到主机

docker cp 容器名:/home/file /home

docker update

#更新基础设置

docker update [OPTIONS] CONTAINER [CONTAINER...]




常用选项:

-c cpu权重

-m 内存限额

--restart  重启策略




示例:

# 更新某个容器的重启策略,使其重启自动启动

docker update --restart=always <CONTAINER ID>

其他操作

docker volume create

# 创建卷

docker volume create [OPTIONS] [VOLUME]




选项:

-d , --driver 默认local   指定卷驱动程序名称

  --label  设置卷的元数据

  --name  指定卷名

-o , --opt  设置驱动程序特定选项




示例:

# 创建一个卷

docker volume create hello




# 使用这个卷

docker run -d -v hello:/world busybox ls /world

挂载卷说明

# 将容器内的目录,挂载到宿主机上或其他容器内,实现同步和共享,并且删除日期后挂载到本地的文件也不会消失




# 指定目录挂载:

dokcer run -it -v 主机内目录:容器内目录 镜像名/id




# 匿名挂载:

docker run -d -v 容器内目录 镜像名/id




# 具名挂载

docker run -d -v 卷名:容器内目录 镜像名/id




# 查看所有挂载的卷:

docker volume ls




# 查看卷信息

docker volume inspect 卷名




# 所有docker容器内的卷,在未指定主机内目录时,都会创建在:/var/lib/docker/volumes/卷名/_data 下




示例:

# minio文件服务器,指定目录挂载

docker run -p 9000:9000 --name minio -d \

-e "MINIO_ACCESS_KEY=admin" \

-e "MINIO_SECRET_KEY=admin123456" \

-v /home/cc/minio/data:/data \

-v /home/cc/minio/config:/root/.minio minio/minio server /data




# 数据卷容器(多个容器共享一个卷)

docker run -it --name 容器02 --volumes from 容器01 镜像名/id

docker network create

# 创建一个网络
docker network create [OPTIONS] NETWORK


常用选项:
-d , --driver  驱动程序,默认bridge,可选overlay或第三方或自定义
--config-from  从中复制配置的网络
--ipv6  启用IPv6网络
--label  在网络上设置元数据


network创建参数挺多的,这里不赘述,感兴趣可以看下官网文档


示例:
# 创建一个overlay 模式的网络
docker network create -d overlay my-network


# 容器连接至该网络
docker run -itd --network=my-network busybox

网络模式说明

# 查看IP
$ ip addr 
# 查看docker0
$ ip addr show docker0

bridge 模式

bridge 模式

# 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥

# 这个docker0 也作为容器的默认网关,主机也可以ping通容器,但是容器之间是隔离的

# 不写–net参数,默认就是bridge模式。使用docker run -p时,docker 实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。




# 新建一个网络

$ docker network create -d bridge my-net




# 运行一个容器并连接到新建的 my-net 网络

$ docker run -it --rm --name busybox1 --network my-net busybox sh




# 加入系统网络的应用,可以互相ping通,如我可以在其他加入了my-net的容器里:

$ ping busybox

> PING busybox (172.19.0.2): 56 data bytes

> 64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms

> 64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms




# 如果你有多个容器之间需要互相连接,推荐使用Docker Compose。

Host 模式

# 如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个 Network Namespace




示例:

$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3

Container 模式

# 这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享

# 示例,独立的 docker_bri1 网络:

$ docker run -tid --net=container:docker_bri1 \

       --name docker_con1 ubuntu-base:v3

None 模式

None 模式

# Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置(如有需要,自己手动配置)

链接:https://www.jianshu.com/p/ab701cebafa8

Tags:

最近发表
标签列表