Docker学习

文章目录

  • 我的`docker`环境
    • 替换`apt`软件包镜像源
    • `docker`安装
      • 以`apt`包管理器安装`docker`
        • 卸载
      • 以`docker`官方存储库安装
        • 卸载
    • 添加某用户到`docker`组
    • 配置`docker`镜像
  • `docker`命令学习
    • 操作守护进程相关命令
    • 操作镜像相关命令
      • 查看镜像
      • 搜索镜像
      • 拉取镜像
      • 删除镜像
    • 操作容器相关命令
      • 查看容器
      • 创建容器
      • 进入容器
      • 启动容器
      • 停止容器
      • 删除容器
      • 查看容器信息
  • 容器的数据卷
      • 数据卷的概念以及作用
        • 概念
        • 作用
      • 配置数据卷
      • 数据卷概念
  • 部署应用案例
    • 部署`mysql`
    • 部署`tomcat`
    • 部署`nginx`
  • `Dockerfile`
    • `docker`镜像原理
    • 镜像制作
      • 容器转为镜像
      • `dockerfile`
    • `dockerfile`关键字
    • 案例
      • 搭建一个`springboot`的环境
      • 自定义`centos`
  • `docker`服务编排
    • 服务编排概念
    • `Docker Compose`概述
      • 一、安装`Docker Compose`
      • 二、卸载`Docker Compose`
      • 三、 使用docker compose编排nginx+springboot项目

我的docker环境

Ubuntu 20.04.6 LTS

替换apt软件包镜像源

修改/etc/apt/source.list中所有的

http://cn.archive.ubuntu.com/ubuntu

->

https://mirrors.tuna.tsinghua.edu.cn/ubuntu

cd /etc/apt
# 备份文件
cp source.list source.list.package
# 替换镜像源
sed -i 's/http:\/\/cn\.archive\.ubuntu\.com\/ubuntu\//https:\/\/mirrors\.tuna\.tsinghua\.edu\.cn\/ubuntu\//g' source.list

docker安装

apt包管理器安装docker

sudo apt install docker.io

卸载

如果要卸载

sudo apt-get purge docker.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

docker官方存储库安装

  1. 更新 apt 包索引,并且安装一些软件使得apt可以通过HTTPS协议访问软件库。
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
  1. 添加docker官方的GPG秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 设置一个标准的docker软件仓库。
# 会在/etc/apt/source.list.d/添加一个叫docker.list的文件
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/dockerarchive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 更新apt 包索引并查看docker 可用版本列表
sudo apt-get update
apt-cache madison docker-ce
  1. 安装docker

    1. 安装特定版本docker语法,例如:5:24.0.2-1~ubuntu.18.04~bionic

      sudo apt-get install docker-ce=<VERSION_STRING> \
      docker-ce-cli=<VERSION_STRING> \
      containerd.io=<VERSION_STRING> \
      docker-compose-plugin=<VERSION_STRING>
      

      使用具体版本号代替

      sudo apt-get install docker-ce=5:24.0.5-1~ubuntu.20.04~focal \
      docker-ce-cli=5:24.0.5-1~ubuntu.20.04~focal \
      containerd.io=1.6.21-1 \
      docker-compose-plugin=2.20.2-1~ubuntu.20.04~focal
      
    2. 或者直接安装最新版docker-ce及相关软件

      sudo apt-get update
      sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
      
  2. 检查docker engine是否安装正确

    sudo docker run hello-world
    

卸载

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

删除相关目录

sudo rm -rf /var/lib/docker && sudo rm -rf /var/lib/containerd && sudo rm -rf /etc/docker/

添加某用户到docker

为了不让每次输入docker指令都输入sudo
我们讲用户添加到docker

// 将用户从docker用户组中移除 gpasswd -d <username> docker
// 将用户添加到docker 用户组
sudo addgroup -a <username> docker
sudo service docker restart
// 查看用户信息
id <username>

配置docker镜像

/etc/docker/daemon.json添加镜像源

{
 "registry-mirrors": [
 	"https://hub-mirror.c.163.com",
	"https://docker.mirrors.ustc.edu.cn",
	"https://registry.docker-cn.com"
 ]
}

docker命令学习

操作守护进程相关命令

systemctl 操作 docker

systemctl enable docker # 开机启动docker

操作镜像相关命令

查看镜像

docker images

docker images -q  # 显示所有的镜像id
REPOSITORY TAG IMAGE ID CREATED SIZE
仓库(镜像名称) 版本 镜像id(删除时会用) 创建时间 大小

搜索镜像

docker search xxxx

在网络上搜索镜像包

拉取镜像

docker pull redis:7.0
  • 可以指定版本也可以不指定,不指定的话默认latest

删除镜像

docker rmi redis
  • 可以写名称:版本,也可以写image id

操作容器相关命令

查看容器

docker ps

显示出正在运行的容器列表

docker ps -a

显示出历史所有运行过的容器列表

docker ps -aq

显示出所有历史运行过的容器列表id

创建容器

docker run -it --name=c1 redis:latest /bin/bash
  • -i表示保持容器运行,如果不加的话容器默认状态就为exit
  • -t为容器重新分配一个伪输入终端,exit后容器关闭
  • --name=xx分配名字
  • redis:latest指定镜像
  • /bin/bash进入容器的初始化指令
docker run --id --name=c2 redis:latest

返回容器id

  • -d以守护模式运行容器。创建一个容器在后台运行,使用exit退出后容器不会关闭

-it创建一个交互式容器,-id创建一个守护式容器

进入容器

docker exec -it c2 /bin/bash
  • 以交互的终端方式进入c2

启动容器

docker start c2
  • 启动exit状态的容器

停止容器

docker stop c2
  • 关闭已经启动的容器

删除容器

docker rm c1
  • 从容器列表中删除容器
docker rm `docker ps -aq`
  • 删除所有容器

查看容器信息

docker inspect c2

容器的数据卷

数据卷的概念以及作用

概念

宿主机上有数据卷目录,容器内部也有数据卷目录,容器内部的数据卷目录挂载的是宿主机上的数据卷目录。所以可以回答下面三个问题

  • docker容器删除后,在容器中产生的数据也会随之销毁吗
    • 相当于不挂载了,只要宿主数据卷还在就行
  • docker容器和外部机器可以直接交换文件吗
    • 外部机器与宿主的数据卷进行交互间接修改docker容器数据
  • 容器之间想要进行数据交互
    • 不同容器间挂载可以挂载同一个宿主数据卷

一个数据卷可以被多个容器挂载

一个容器可以挂载多个数据卷

作用

  • 容器数据持久化
  • 外部机器和容器间通信
  • 容器之间数据交换

配置数据卷

docker run -it --name=c1 -v /root/data:/root/data_container redis:latest /bin/bash
  • 挂载路径需要写绝对路径

  • 如果目录不存在会自动创建

  • 可以挂载多个数据卷

    docker run -it --name=c1 \
    -v /root/data:/root/data_container \
    -v /root/data1:/root/data1 \
    redis:latest \
    /bin/bash
    

数据卷概念

Docker学习_第1张图片

c3挂载了一个数据卷,c1c2分别挂载了c3,那么他们也相当于挂载到了对应的数据卷

此时c3就叫做数据卷容器

docker run -it --name=c3 -v /volumn redis:latest

docker run -it --name=c2 --volumn-from c3 redis:latest
docker run -it --name=c1 --volumn-from c3 redis:latest

部署应用案例

部署mysql

  1. 搜索应用

    docker search mysql
    
  2. 拉取mysql镜像

    docker pull mysql:5.6
    
  3. 创建容器,设置端口映射、目录映射

    mkdir ~/mysql
    cd ~/mysql
    
    docker run -id \
    -p 3307:3306 \
    --name=c_mysql \
    -v $PWD/conf:/etc/mysql/conf.d \ 
    -v $PWD/logs:logs \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.6
    
    • 映射端口
    • 目录映射
    • 设置mysql密码

进入容器

docker exec -it c_mysql /bin/bash

部署tomcat

mkdir ~/tomcat
cd ~/tomcat

docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat
  • 设置webapp映射目录
  • 映射端口

部署nginx

docker run -id --name=c_nginx \ 
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx

Dockerfile

docker镜像原理

为什么centos镜像只有200MB,而一个centos操作系统要几个G

为什么tomcat镜像有500MB,而一个tomcat安装包只有几十兆

  • docker是一个分层的文件系统
  • docker的镜像复用宿主机的bootfs,自己只要有rootfs和其他镜像层

镜像制作

容器转为镜像

docker commit 容器id 镜像名称:版本号

将镜像打成压缩包

docker save -o 压缩文件名称 镜像名称:版本号

将压缩包转为镜像

docker load -i 压缩文件名称

目录挂载的需要重新docker run的时候使用-v指定

dockerfile

一个文本文件,包含了一条条的指令。

每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。

dockerfile关键字

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

案例

搭建一个springboot的环境

创建一个springboot的项目,jdk使用8maven打包成jar包传给ubuntu

jar包目录下创建dockerfile

# springboot_dockerfile
FROM java:8
MAINTAINER ljq 
ADD springbootDocker-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar

加载dockerfile文件

docker build -f ./springboot_dockerfile -t app .

创建容器

docker run -id -p9000:8080 app

自定义centos

设置默认登录路径为/usr

可以使用vim

Docker学习_第2张图片

docker服务编排

服务编排概念

按照一定的业务规则批量管理容器

Docker Compose概述

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。

使用步骤:

  1. 利用dockerfile定义运行环境镜像
  2. 使用docker-compose.yml定义组成应用的各服务
  3. 运行docker-compose up启动应用

一、安装Docker Compose

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

二、卸载Docker Compose

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

三、 使用docker compose编排nginx+springboot项目

  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写 docker-compose.yml 文件
version: '3'
services:
  nginx:
   image: nginx
   ports:
    - 80:80
   links:
    - app
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
    image: app
    expose:
      - "8080"
  1. 创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
  1. ./nginx/conf.d目录下 编写itheima.conf文件
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  1. ~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up
  1. 测试访问
http://192.168.149.135/hello

你可能感兴趣的:(云原生专栏,docker,学习,容器)