Docker学习

文章目录

我的docker环境

Ubuntu 20.04.6 LTS

替换apt软件包镜像源

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

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

->

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

bash 复制代码
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

bash 复制代码
sudo apt install docker.io

卸载

如果要卸载

bash 复制代码
sudo apt-get purge docker.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

docker官方存储库安装

  1. 更新 apt 包索引,并且安装一些软件使得apt可以通过HTTPS协议访问软件库。
bash 复制代码
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
  1. 添加docker官方的GPG秘钥
bash 复制代码
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 设置一个标准的docker软件仓库。
bash 复制代码
# 会在/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 可用版本列表
bash 复制代码
sudo apt-get update
apt-cache madison docker-ce
  1. 安装docker

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

      bash 复制代码
      sudo apt-get install docker-ce=<VERSION_STRING> \
      docker-ce-cli=<VERSION_STRING> \
      containerd.io=<VERSION_STRING> \
      docker-compose-plugin=<VERSION_STRING>

      使用具体版本号代替

      bash 复制代码
      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及相关软件

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

    bash 复制代码
    sudo docker run hello-world

卸载

bash 复制代码
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin

删除相关目录

bash 复制代码
sudo rm -rf /var/lib/docker && sudo rm -rf /var/lib/containerd && sudo rm -rf /etc/docker/

添加某用户到docker

为了不让每次输入docker指令都输入sudo

我们讲用户添加到docker

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

配置docker镜像

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

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

docker命令学习

操作守护进程相关命令

bash 复制代码
systemctl 操作 docker

systemctl enable docker # 开机启动docker

操作镜像相关命令

查看镜像

bash 复制代码
docker images

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

搜索镜像

bash 复制代码
docker search xxxx

在网络上搜索镜像包

拉取镜像

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

删除镜像

bash 复制代码
docker rmi redis
  • 可以写名称:版本,也可以写image id

操作容器相关命令

查看容器

bash 复制代码
docker ps

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

bash 复制代码
docker ps -a

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

bash 复制代码
docker ps -aq

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

创建容器

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

返回容器id

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

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

进入容器

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

启动容器

bash 复制代码
docker start c2
  • 启动exit状态的容器

停止容器

bash 复制代码
docker stop c2
  • 关闭已经启动的容器

删除容器

bash 复制代码
docker rm c1
  • 从容器列表中删除容器
bash 复制代码
docker rm `docker ps -aq`
  • 删除所有容器

查看容器信息

bash 复制代码
docker inspect c2

容器的数据卷

数据卷的概念以及作用

概念

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

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

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

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

作用

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

配置数据卷

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

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

  • 可以挂载多个数据卷

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

数据卷概念

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

此时c3就叫做数据卷容器

bash 复制代码
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. 搜索应用

    bash 复制代码
    docker search mysql
  2. 拉取mysql镜像

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

    bash 复制代码
    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密码

进入容器

bash 复制代码
docker exec -it c_mysql /bin/bash

部署tomcat

bash 复制代码
mkdir ~/tomcat
cd ~/tomcat

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

部署nginx

bash 复制代码
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和其他镜像层

镜像制作

容器转为镜像

bash 复制代码
docker commit 容器id 镜像名称:版本号

将镜像打成压缩包

bash 复制代码
docker save -o 压缩文件名称 镜像名称:版本号

将压缩包转为镜像

bash 复制代码
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

dockerfile 复制代码
# springboot_dockerfile
FROM java:8
MAINTAINER ljq <luopanforever@163.com>
ADD springbootDocker-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar

加载dockerfile文件

bash 复制代码
docker build -f ./springboot_dockerfile -t app .

创建容器

bash 复制代码
docker run -id -p9000:8080 app

自定义centos

设置默认登录路径为/usr

可以使用vim

docker服务编排

服务编排概念

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

Docker Compose概述

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

使用步骤:

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

一、安装Docker Compose

shell 复制代码
# 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

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

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

  1. 创建docker-compose目录
shell 复制代码
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写 docker-compose.yml 文件
shell 复制代码
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目录
shell 复制代码
mkdir -p ./nginx/conf.d
  1. ./nginx/conf.d目录下 编写itheima.conf文件
shell 复制代码
server {
    listen 80;
    access_log off;

    location / {
        proxy_pass http://app:8080;
    }
   
}
  1. ~/docker-compose 目录下 使用docker-compose 启动容器
shell 复制代码
docker-compose up
  1. 测试访问
shell 复制代码
http://192.168.149.135/hello
相关推荐
Mephisto.java6 分钟前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
南宫生35 分钟前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
武子康2 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
使者大牙2 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
As977_2 小时前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi2 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
Rattenking2 小时前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
景天科技苑2 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
dsywws3 小时前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
道法自然04023 小时前
Ethernet 系列(8)-- 基础学习::ARP
网络·学习·智能路由器