1、Docker简介

Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。

2、Docker环境安装

2.1、移除以前docker相关包

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2.2、配置yum源

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.3、安装docker

sudo yum install -y docker-ce docker-ce-cli containerd.io

2.4、启动

systemctl enable docker --now

2.5、配置加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://5cn52dc7.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3、Docker镜像常用命令

请添加图片描述

3.1、搜索镜像

docker search tomcat

image-20221016145533617

3.2、下载镜像

docker pull tomcat

image-20221016145657565

3.3、列出镜像

docker images

image-20221016145820017

3.4、删除镜像

  • 指定名称删除镜像:
docker rmi tomcat
  • 指定名称删除镜像(强制):
docker rmi -f tomcat
  • 删除所有没有引用的镜像:
docker rmi `docker images | grep none | awk '{print $3}'`
  • 强制删除所有镜像:
docker rmi -f $(docker images)

3.5、打包镜像

docker save -o /root/xxx.tar  <name>

image-20221016150343819

3.6、导入镜像

docker load -i /root/xxx.tar

image-20221016150957470

3.7、容器打包

docker export -o /root/xx.tar  <name>

image-20221016151556819

3.8、导入容器

docker import xx.tar <name>:latest

image-20221016151912860

image-20221016152000939

3.9、推送镜像

# 登录Docker Hub
docker login
# 给本地镜像打标签为远程仓库名称
docker tag  consul:latest linshengqian/consul:v1.0
# 推送到远程仓库
docker push linshengqian/consul:v1.0

image-20221016152413392

image-20221016152512542

3.10、新建并启动容器

docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx:1.17.0
  • –name=“Name” :指定容器名称,之后可以通过容器名称来操作容器;
  • -e:设置容器的环境变量,这里设置的是时区;
  • -v:将宿主机上的文件挂载到宿主机上,格式为:宿主机文件目录:容器文件目录;
  • -d:表示容器以后台方式运行。
  • –network :指定网络
  • -P: 随机端口映射(大写P)
  • -p:将宿主机和容器端口进行映射,指定端口映射,格式为:宿主机端口:容器端口,(小写p)
    • ip:hostPort:containerPort
    • ip::containerPort
    • hostPort:containerPort (常用)
    • containerPort

3.11、列出容器

  • 列出运行中的容器:
docker ps
  • 列出所有容器,包括未运行的:-a
docker ps -a
  • 列出最近创建的容器:-l
docker ps -l
  • 运行中的容器总的文件大小:-s
docker ps -s
  • 根据条件过滤显示的内容:-f
docker ps -f name=mysql

image-20221016154302382

3.12、停止容器

$ContainerName表示容器名称,$ContainerId表示容器ID,可以使用容器名称的命令,基本也支持使用容器ID:

docker stop $ContainerName(or $ContainerId)

3.13、强制停止容器

docker kill $ContainerName

3.14、启动容器

docker start $ContainerName

3.15、进入容器

  1. 方法一:

    docker attach  $ContainerName(or $ContainerId)
    

    attach 直接进入容器启动命令的终端,不会启动新的进程

  2. 方法二:指定用户进入容器

    docker exec -it --user root $ContainerName(or $ContainerId)
    

    exec 是在容器中打开新的终端,并且可以启动新的进程

  3. 方法三:

  • 先查询出容器的pid
docker inspect --format "{{.State.Pid}}" $ContainerName
  • 根据容器的pid进入容器:
nsenter --target "$pid" --mount --uts --ipc --net --pid

image-20221016155144526

3.16、退出容器

exit # 容器停止退出

ctrl+P+Q # 容器不停止退出

3.17、删除容器

  • 删除指定容器:
docker rm $ContainerName
  • 强制删除指定容器:
docker rm -f $ContainerName
  • 强制删除所有容器;
docker rm -f $(docker ps -a -q)
  • 按名称通配符删除容器,比如删除以名称redis-开头的容器:
docker rm `docker ps -a | grep redis-* | awk '{print $1}'`
  • 删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

3.18、查看容器的日志

  • 查看容器产生的全部日志:
docker logs  $ContainerName
  • 动态查看容器产生的日志:
docker logs -f $ContainerName

3.19、修改容器的启动方式

  • 将容器启动方式改为always
docker update --restart always  $ContainerName
或
docker container update --restart=always $ContainerName

3.20、同步宿主机时间到容器

docker cp /etc/localtime $ContainerName:/etc/

3.21、查看容器资源占用状况

  • 查看指定容器资源占用状况,比如cpu、内存、网络、io状态:
docker stats $ContainerName

  • 查看所有容器资源占用情况:
docker stats -a

image-20221016160142597

3.22、查看容器磁盘使用情况

docker system df

image-20221016160214163

3.23、查看所有网络

docker network ls

3.24、创建外部网络

docker network create -d bridge $NetworkName

3.25、创建外部网络

docker inspect  $NetworkName

3.26、查看容器/镜像的元数据

docker inspect  $ContainerName(or $ContainerId)

3.27、拷贝文件

  • 容器到宿主机
docker cp  $ContainerName(or $ContainerId):/home/f1  /home
  • 宿主机到容器
docker cp /home/licence.txt  $ContainerName(or $ContainerId):/home

4、容器状态有7种

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

5、所有网路模式

网络模式配置说明
bridge模 式–net=bridge默认值,在Docker网桥docker0上为容器创建新的网络 栈
none模式–net=none不配置网络,用户可以稍后进入容器,自行配置
container 模式– net=container:name/id容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace
host模式–net=host容器和宿主机共享Network namespace
host模式–net=自定义网络用户自己使用network相关命令定义网络,创建容器的 时候可以指定为自己定义的网络

其中有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。

  • -b BRIDGE--bridge=BRIDGE 指定容器挂载的网桥
  • --bip=CIDR 定制 docker0 的掩码
  • -H SOCKET--host=SOCKET Docker 服务端接收命令的通道
  • --icc=true|false 是否支持容器之间进行通信
  • --ip-forward=true|false 请看下文容器之间的通信
  • --iptables=true|false 是否允许 Docker 添加 iptables 规则
  • --mtu=BYTES 容器网络中的 MTU

下面2个命令选项既可以在启动服务时指定,也可以在启动容器时指定。在 Docker 服务启动的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。

  • --dns=IP_ADDRESS 使用指定的DNS服务器
  • --dns-search=DOMAIN 指定DNS搜索域

最后这些选项只有在 docker run 执行时使用,因为它是针对容器的特性内容。

  • -h HOSTNAME--hostname=HOSTNAME 配置容器主机名

  • --link=CONTAINER_NAME:ALIAS 添加到另一个容器的连接

  • --net=bridge|none|container:NAME_or_ID|host 配置容器的桥接模式

  • -p SPEC--publish=SPEC 映射容器端口到宿主主机

  • -P or --publish-all=true|false 映射容器所有端口到宿主主机

在 docker 网络中,有三个比较核心的概念:沙盒(Sandbox)、网络(Network)、端点(Endpoint)

image-20221016162745918

  1. 沙盒提供了容器的虚拟网络栈,也就是端口套接字、IP 路由表、防火墙等的内容。隔离了容器网络与宿主机网络,形成了完全独立的容器网络环境。
  2. 网络可以理解为 docker 内部的虚拟子网,网络内的参与者相互可见并能够进行通讯。docker 的这种虚拟网络也是于宿主机网络存在隔离关系的,其目的主要是形成容器间的安全通讯环境。
  3. 端点是位于容器或网络隔离墙之上的洞,其主要目的是形成一个可以控制的突破封闭的网络环境的出入口。当容器的端点与网络的端点形成配对后,就如同在这两者之间搭建了桥梁,就能够进行数据传输了。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐