Docker的基本使用

一、安装

Docker安装文档

1.Linux安装
# 卸载旧版本
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
# 安装docker所需要的工具
sudo yum install -y yum-utils
​
# 配置docker下载的地址
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
​
# 创建docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
​
# 启动docker
sudo systemctl start docker
​
# 检查docker是否安装成功
sudo docker -v
​
# 设置开机自启
sudo systemctl enable docker
​
# 配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://cxmerfvo.mirror.aliyuncs.com"]
}
EOF
​
sudo systemctl daemon-reload
sudo systemctl restart docker
2.Ubuntu安装
# 卸载旧版本
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done


# 设置 Docker 的apt存储库
sudo apt-get update

sudo apt-get install ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings
​
# 这里使用的是清华镜像源,并不是官方提供的国外站点
sudo curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc
 
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


# 更新  
sudo apt-get update

# 安装docker软件包(如果失败可能是网络问题导致,需要重试几次)
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 检查docker是否安装成功
sudo docker -v

#设置开机启动
sudo systemctl enable docker

# 修改DNS
sudo vim /etc/resolv.conf

# 添加如下两行
nameserver 8.8.8.8
nameserver 8.8.4.4


# 修改源
sudo vim /etc/docker/daemon.json

# 添加如下内容
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://docker.nju.edu.cn",
        "https://iju9kaj2.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://cr.console.aliyun.com",
        "https://hub.docker.com",
        "http://mirrors.ustc.edu.cn"
    ]
}


# 重新启动
sudo systemctl daemon-reload
sudo systemctl restart docker
二、Docker常用命令
1.启动命令
启动: sudo systemctl start docker
停止: sudo systemctl stop docker 
重启: sudo systemctl restart docker
查看状态: sudo systemctl status docker
开机启动: sudo systemctl enable docker
查看概要: sudo docker info
2.镜像命令
查看镜像: sudo docker images  OPTIONS: -a: 查看全部 -q:只显示镜像ID
拉取镜像: sudo docker pull 【镜像名称】:【版本号】  注: 如果不选版本号,默认下载最新版
查看镜像/容器/数据卷所占的空间: sudo docker system df
删除镜像: sudo docker rmi -f 镜像名称ID
删除全部: sudo docker rmi -f $(docker images -qa)
3.容器命令
启动容器: sudo docker start xxx
重启容器: sudo docker restart xxx
停止容器: sudo docker stop xxx
强制停止容器: sudo docker kill xxx
删除已停止的容器: sudo docker rm xxx
删除所有已停止的容器: sudo docker container prune
​
查看容器日志: sudo docker logs xxx
查看容器细节: sudo docker inspect xxx
进入容器内部: sudo docker exec -it xxx /bin/bash
​
进入redis: sudo docker exec -it xxx redis-cli
​
从容器内拷贝文件到主机上: sudo docker cp 容器ID:容器内路径 目的主机路径
导出容器的内容作为一个tar归档文件: sudo docker export xxx > 文件名.tar
导入: cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
​
加载docker镜像文件: sudo docker load -i xxx.tar
​
提交新的容器: sudo docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[版本号]
三、容器卷
1.容器卷权限
# --privileged=true 使用这个参数开放权限。否则可能存在没有权限的问题。这个权限和linux权限不是一回事
sudo docker run -it --name 名称 --privileged=true -v /宿主机目录:/容器内目录 镜像名
​
# 设置只读权限(ro,默认是rw读写权限)
sudo docker run -it --privileged=true -v /宿主机目录:/容器内目录:ro 镜像名
2.容器卷的继承和共享
sudo docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
3.容器卷常用命令
# 创建数据卷
sudo docker volume create
​
# 查看所有数据卷
sudo docker volume ls
​
# 删除指定数据卷
sudo docker volume rm
​
# 查看某个数据卷详情
sudo docker volume inspect
​
# 清除数据卷
sudo docker volume 
四、网络
1.作用
容器间的互联和通讯以及端口映射
容器IP变动的时候可以通过服务名直接网络通讯而不受到影响
2.常用命令
# 查看网络(默认情况下会有bridge、host、none三个网络)
sudo docker network ls
​
# 创建网络
sudo docker network create 网络名
​
# 删除网络
sudo docker network rm 网络名
3.五种网络模式
bridge: 为每一个容器分配、设置IP等,并将容器连接到一个docker0。虚拟网桥,默认为该模式
host: 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP端口
none: 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网络连接,IP等。
container: 新建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP,端口范围。
自定义网络
4.自定义网络
# 创建网络
sudo docker network create my_net
# 加入自定义网络
sudo docker run -d  -p 8081:8080 --network my_net --name tomcat81 billygoo/tomcat8-jdk8
sudo docker run -d -h 192.168.80.202 -p 8082:8080 --network my_net --name tomcat82 billygoo/tomcat8-jdk8
​
# 进入容器内部
sudo docker exec -it 容器ID bash
# ping服务名。在tomcat81中ping tomcat82
ping tomcat82
五、自定义Docker镜像
1.自定义Docker镜像
# 注意: 
#   1.容器名称规范为: 包名/容器名
#   2.容器ID为正在修改的容器ID
sudo docker commit -m ="提交的描述信息" -a="作者" 容器ID 容器名称:[标签名]
​
# 示例如下:
# 拉取ubuntu镜像
sudo docker pull ubuntu
​
# 启动ubuntu镜像
sudo docker run -dit --name ubuntu ubuntu
​
# 进入ubuntu容器
sudo docker exec -it ubuntu bash
​
# 添加vim依赖
sudo apt-get update
sudo apt-get -y install yum
​
# 退出容器
exit 
​
# 提交镜像文件
sudo docker commit -m="add vim" -a="wzc" 15a129d358ec wzc/myubuntu:1.3
​
# 查看docker容器(此时会看到已经创建好的新容器,会发现SIZE变大了),也可以通过启动容器查看vim依赖是否添加成功
sudo docker images
2.镜像导入导出
# 镜像导出(注意这里是容器ID不是镜像ID)
sudo docker export 容器ID > xxx.tar
# 镜像导入
sudo docker import xxx.tar xxx:latest
3.本地镜像发布到云服务
# 在阿里云中找到容器镜像服务
# 管理控制台进入个人实例
# https://cr.console.aliyun.com/cn-hangzhou/instance/dashboard
# 首先需要创建一个命名空间
# 创建镜像仓库
# 完成信息填写后点击下一步aliyun会自动生成很多命令。选取第三步。将镜像推送到Registry
4.Docker私有库搭建&推送自定义镜像到私有库
# 拉取镜像Docker Registry
sudo docker pull registry
​
# 运行私有库Registry,相当于本地有个私有DockerHub
# 当使用--privileged选项时,Docker会为容器提供与主机系统几乎相同的权限和访问权限。这意味着在容器内运行的进程可以访问主机的所有设备、文件、网络接口等,就像在主机上直接运行一样。
sudo docker run -d --name registry -p 5000:5000 -v /wzc/registry/:/tmp/registry --privileged=true registry
​
# 案例演示创建一个新镜像,ubuntu安装ifconfig命令
# 这里是有一个ubunbu的镜像,进入容器内部之后执行下边两行命令,如果没有镜像。需要先拉取镜像并进入到容器内部。
# 拉取ubuntu命令为 sudo docker pull ubuntu # 进入容器内部命令为 sudo docker -it exec ubuntu bash
sudo apt-get update
sudo apt-get install net-tools
# 安装之后创建新的镜像文件(docker commit -m ="提交的描述信息" -a="作者" 容器ID 容器名称:[标签名])
​
# curl验证私服库上都有什么镜像(IP为自己的IP,端口是因为registry映射端口就是5000)
curl -XGET http://192.168.80.200:5000/v2/_catalog
​
# 将新镜像修改为符合Registry规范
# 语法:
    sudo docker tag 镜像:Tag Host:Port/Repository:Tag
# 示例:
    sudo docker tag mybuntu:1.4 192.168.80.200:5000/mybuntu:1.4
​
# 修改daemon.json配置文件使之支持http
sudo vi /etc/docker/daemon.json

# 修改内容如下
"insecure-registries": ["192.168.80.200:5000"]

# 重启docker
sudo systemctl restart docker
​
# 将本地镜像push到私有镜像仓库(push后边跟的是之前修改好的Registry)
sudo docker push 192.168.80.200:5000/mybuntu:1.4
​
# 删除本地镜像
sudo docker rmi -f 192.168.80.200:5000/mybuntu:1.4
​
# pull到本地运行
sudo docker pull 192.168.80.200:5000/mybuntu:1.4
六、DockerFile
1.保留字
关键字描述
FROM基本镜像,当前新镜像基于哪个镜像,指定一个已存在的镜像作为模板,第一行必须是from
MAINTAINER镜像的作者和邮箱地址
RUN要执行的命令。有两种格式,shell或exec
EXPOSE当前容器对外暴露的端口
WORKDIR指定在创建容器后,终端默认登陆进来的工作目录
USER指定该镜像以什么样的用户去执行,如果都不指定,默认是root
ENV构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY类似于ADD,将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD指定容器启动后要干的事情。Dockerfile可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT类似于CMD指令,但是它不会被docker run后面的命令覆盖,而且这些命令行会被当做参数传递给ENTRYPOINT指令的程序如果ENTRYPOINT后边跟着CMD。则CMD变成了传递参数的
2.案例
  • 简单打包SpringBoot项目

# 1.编写docker-compose.yml文件,内容如下:

# 使用JDK8
FROM java:8

# 作者名称,一般是作者+邮箱
MAINTAINER wzc

# 定义端口
ENV SERVER_PORT=8001

# 添加jar包到镜像
ADD demo.jar app.jar

# 执行命令
ENTRYPOINT ["java", "-jar", "app.jar"]

# 对外暴漏端口
EXPOSE ${SERVER_PORT} 

​
# 2.打包镜像文件(-f参数标识指定构建哪个jar包)
sudo docker build -f ./docker_test.jar -t app .


# 3.启动docker镜像
sudo docker run -dit -p 8081:8081 app

  • 在项目中设置环境变量

#  编写
vim Dokcerfile
​
# 内容如下
# 注意: 下载安装的东西要在这个继承的镜像内存在
FROM centos
MAINTAINER wzc<498398164@qq.com>
​
ENV MYPATH /usr/local
WORKDIR $MYPATH
​
# 安装vim编辑器
RUN yum -y install vim
# 安装ifconfig命令查看网络IP
RUN yum -y install net-tools
# 安装JDK8
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD是相对路径jar,把jdk添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV PATH $JAVA_HOME/bin:$PATH
​
EXPOSE 80
​
## 构建
docker build -t 新镜像名称:TAG.                
七、Docker-Compose
1.安装
  • Centos安装
# 这里采用离线安装https://github.com/docker/compose/tags/1.27.4
​
sudo chmod +x /usr/local/bin/docker-compose

docker compose version
  • Ubuntu安装

sudo apt-get update
sudo apt-get install docker-compose-plugin
sudo docker compose version
2.核心概念与使用步骤
# 概念
一文件: docker-compose.yml
两要素: 服务: 指每一个服务实例
        工程: 由一组关联的容器组成的要给完成业务单元,在docker-compose.yml中定义
      
          
# 步骤
编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
执行docker-compose up命令启动并运行整个应用程序,完成一键部署上线
3.常用命令
sudo docker compose -h # 查看帮助
sudo docker compose up # 启动所有docker-compose服务
sudo docker compose up -d # 后台启动所有docker-compose服务
sudo docker compose down # 停止并删除容器、网络、卷、镜像
sudo docker compose exec yum里面的服务ID # 进入容器示例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
sudo docker compose ps # 展示当前docker-compose编排过的运行的所有容器
sudo docker compose top # 展示当前docker-compose编排过的容器进程
sudo docker compose logs yum里面的服务ID # 查看容器输出日志
sudo docker compose config # 检查配置
sudo docker compose restart # 重启服务
sudo docker compose start # 启动服务
sudo docker compose stop # 停止服务
4.案例
  • 案例一

    version: "3.1"
    ​
    services:
      mysql:
        image: mysql:5.7
        container_name: mysql
        restart: always
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: tb_system
          TZ: Asia/Shanghai
        ports:
          - "3306:3306"
        privileged: true
        volumes:
          - /usr/local/mysql/data:/var/lib/mysql
          - /usr/local/mysql/conf:/etc/mysql/conf.d
          - /usr/local/mysql/log:/var/log/mysql
        networks:
          - mynet
        command:
          --default-authentication-plugin=mysql_native_password
          --max_connections=1000
          --character-set-server=utf8mb4
          --collation-server=utf8mb4_general_ci
    ​
    networks:
      mynet:
        driver: bridge

  • 案例二

    version: "3"
    ​
    services:
      app:
        image: app:1.4
        container_name: app
        ports:
          - "8985:8985"
        networks:
          - mynet
        depends_on:
          - mysql
    ​
      mysql:
        image: mysql:5.7
        container_name: mysql
        environment:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: shoppin
        ports:
          - "3306:3306"
        privileged: true
        volumes:
          - /usr/local/mysql/data:/var/lib/mysql
        networks:
          - mynet
        command:
          --default-authentication-plugin=mysql_native_password
    ​
    networks:
      mynet:
        driver: bridge

八、轻量级监控Portainer
sudo docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portianer_data:/data portainer/portainer
​
# 汉化安装
sudo docker run -d -p 8000:8000 -p 9443:9443 --name portainer-zh --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /docker_data/portainer/data:/data \
-v /etc/localtime:/etc/localtime \
liuximeng520/portainer-zh:2.11.0
​
# 访问localhost:9443
九、CIG
1.概述
CAdvisor: 监控收集,它是一个容器资源监控工具,包括容器内的内存,CPU,网络IO,磁盘IO等监控,同时提供了一个WEB页面用于查看容器的实时运行状态。CAdvisor默认存储2分钟的数据,而且只
          是针对单物理机。不过,CAdvisor提供了很多数据集成接口,支持InfluxDB,Redis,Kafka,Elasticsearch等集成,可以加上对应配置将监控数据发往这些数据存储起来
主要功能: 展示Host和容器两个层次的监控数据
             展示历史变化数据
  
                        
InfluxDB: 存储数据,是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。CAdvisor默认只在本机保存近2分钟数据,为了持久化存储数据和统一收集展示监控数据,需要将
          数据存储到InfluxDB中。InfluxDB是一个时序数据库,专门用于存储时序相关数据,很适合存储CAdvisor的数据。而且,CAdvisor本身已经提供了集成方法,启动容器时指定配置即可。
主要功能: 基于时间序列,支持与时间有关的相关函数(如最大,最小,求和等)
         可度量行: 可以实时对大量数据进行计算
         基于事件: 支持任意的事件数据
 
                                                         
Granfana: 展示图表,是一个开源的数据分析可视化平台,支持多种数据源配置和丰富的插件及模板功能,支持图标权限控制及报警
主要功能: 灵活丰富的图形化选项
         可以混合多种风格
         支持白天和夜间模式
         多个数据源
2.编排docker-compose
version: '3.1'

volumes:
  grafana_data: {}
​
services:
  influxdb:
    image: tutum/influxdb:0.9
    restart: always
    environment:
      - PRE_CREATE_DB=cadvisor
    ports:
      - "8083:8083"
      - "8086:8086"
    volumes:
      - ./data/influxdb:/data
      
  cadvisor:
    image: google/cadvisor
    links: 
      - influxdb:influxsrv
    command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      
  grafana:
    user: "104"
    image: grafana/grafana
    restart: always
    links:
      - influxdb:influxsrv
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - HTTP_USER=admin
      - HTTP_PASS=admin
      - INFLUXDB_HOST=influxsrv
      - INFLUXDB_PORT=8086
3.校验&启动
# 校验docker-compose文件编排是否正确
sudo docker compose -f docker-cig-compose.yml config -q

# 文件名如果不是docker-compose,需要实用-f 参数指定文件 -d表示后台启动
sudo docker compose -f docker-cig-compose.yml up -d
十、Harbor
1.安装

下载地址

# 需要安装docker-compose
# 解压
sudo tar -xzf harbor-offline-installer-v2.10.0.tgz

# 修改配置
sudo vim harbor.yml

# 内容如下
hostname: 172.31.0.71
port: 81

# 将harbor添加到dokcer信用列表中
sudo vim /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://cxmerfvo.mirror.aliyuncs.com"],
  "insecure-registries": ["172.31.0.71:81"]
}

# 拉取镜像
# ERROR:root:Error: The protocol is https but attribute ssl_cert is not set
# 如果遇见上述报错,在harbor.yml文件中将https部分注释掉即可
./prepare

# 安装
./install.sh

# 打开浏览器访问172.31.0.71:81
# 默认账号: admin
# 默认密码: Harbor12345

# 重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
2.使用
# 标签
sudo docker tag 镜像名:版本号       harbor地址:端口/harbor中的项目名/提交上去的镜像名:版本
sudo docker tag shopping-system:v1 172.31.0.71:81/shopping/shopping-system:v1

# 登录(用户名和密码在Harbor控制台创建)
sudo docker login -u 用户名 -p 密码 172.31.0.71:81

# 推送镜像
sudo docker push 172.31.0.71:81/shopping/shopping-system:v1

# 拉取镜像
sudo docker pull 172.31.0.71:81/shopping/shopping-system:v1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值