关于Docker

docker官方文档https://docs.docker.com/engine/install/ubuntu/
docker 全球镜像仓库https://hub.docker.com/

image.png

1、docker的安装

1.1、卸载旧版

首先如果系统中已经存在旧的Docker,先卸载: 但是不同的系统,卸载方式不一样!!!
Ubuntu系统:

apt-get autoremove docker docker-ce docker-engine  docker.io  containerd runc
dpkg -l | grep docker
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P # 删除无用的相关的配置文件
apt-get autoremove docker-ce-*
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
docker --version	# 检查是否存在

1.2、安装docker

不同版本,安装步骤也不一样。具体看官网!!!

Ubuntu:

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 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

# 安装最新版
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 验证
sudo docker run hello-world

# 添加docker用户组 比如:zyp用户
sudo usermod -aG docker zyp

1.3、启动docker服务

# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

1.4、配置镜像加速器

这里举例阿里云镜像加速器

首先访问阿里云网站:
https://www.aliyun.com/
注册一个账号。
image.png
image.png

docker命令

举例解读一个命令含义

docker run -d \
	--name mysql \
  -p 3307:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:5.7
  • docker run 创建并运行一个容器,-d是让容器在后台运行
  • --name 给这个容器取名,必须唯一
  • -p 端口映射,在这是云服务器的3307端口,与容器内的3306映射。为什么要映射?因为容器内部对外不可访问
  • -e KEY=VALUE 设置环境变量
  • 最后是指定运行镜像的名称 后面通过冒号:可以接版本号,不写的话就是最新版。

常见命令大全

image.png

说明: **IMAGE_NAME:TAG **表示 镜像名称 :版本号
CONTAINER 表示 容器名称
镜像相关:

  • docker pull IMAGE_NAME:TAG
  • docker images
  • docker rmi IMAGE_NAME:TAG
  • docker commit CONTAINER IMAGE_NAME:TAG 创建某个container的镜像
  • docker save -o XXXXXX.tar **IMAGE_NAME:TAG** 将镜像IMAGE_NAME:TAG导出到本地文件XXXXX.tar
  • docker load -i **XXXX.tar** 将镜像IMAGE_NAME:TAG 从本地文件XXXX.tar中加载出来

容器相关:

  • docker run -itd **IMAGE_NAME:TAG** 将一个镜像创建成容器,并运行(可以添加参数 如, -d -i -t)
    • -i 以交互方式运行容器,通常与-t 同时使用
    • -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
      • 即启动交互式容器,一般是 bash
    • -d 后台运行容器,即启动守护式容器
  • docker ps -a 查看本地所有容器
  • docker start CONTAINER 启动容器
  • docker stop CONTAINER 停止容器
  • docker restart CONTAINER 重启容器
  • docker attach CONTAINER 进入容器
    • 先按Ctrl-p,再按Ctrl-q可以挂起容器
  • docker exec -it CONTAINER bash 进入该容器执行命令
  • docker rm **CONTAINER** 删除某个容器
  • docker inspect **CONTAINER** 查看某个容器详情,包括数据卷

docker attach 与docker exec 区别:是否开启一个新的进程

  • docker exec 进入容器后开启一个新的终端,可以在里面操作(常用)
  • docker attach 进入容器正在执行的终端(前提 run 的时候 有-it),不会启动新的进程

数据卷

概念

数据卷是一个虚拟文件夹,它将宿主机的文件夹映射到容器内的文件夹,方便操作容器内的文件

常见命令:

  1. docker volume create 创建数据卷
  2. docker volume ls 查看所有数据卷
  3. docker volume rm 删除指定的数据卷
  4. docker volume inspect 查看某个数据卷的详情
  5. docker volume prune 清除数据卷

如何挂载数据卷?

  • 不需要通过命令去主动创建数据卷,当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
  • 在docker run 命令创建容器时,添加参数 -v **数据卷名**:**容器内文件夹** 进行数据卷的挂载

直接数据挂载宿主机文件夹(不通过数据卷)

  • 在执行dockerrun命令时,使用 -v **本地目录**:**容器内目录** 可以完成本地目录挂载
  • 本地目录必须以 "/" 或 " ./ ”开头,如果直接以名称开头,会被识别为数据卷而非本地目录
    • -v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql (错误)
    • -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录 (正确)

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像
image.png

这里举一个例子:

假设我们现在有一个springboot项目打包好的jar包“my_back.jar”,现在要写一个dockerfile文件

# 
FROM openjdk:11.0-jre-buster
# 
ENV TZ=Asia/Shanghai
RUN ln -snf/usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 
COPY my_back.jar /app.jar
# 
ENTRYPOINT ["java", "-jar", "/app.jar"]

注意: openjdk的版本
在云服务器中,我们需要把dockerfile文件和my_back.jar文件放到同一级目录下,然后
如果我们直接在当前目录下通过dockerfile文件构建镜像:**docker build -t IMAGE_NAME .**
这样,我们的自定义的一个java应用的镜像就构建好了!!!

docker网络

默认情况下,所有的容器都是以bridge的方式连接到Docker的一个虚拟网桥上

image.png

由于,当容器重新启动时,容器分配的IP地址会改变,所以容器之间通过内部IP地址互联是不现实的。
于是,我们需要自定义docker网络。
image.png

自定义网络示例:

假设现在宿主机中已经有,A,B两个容器,以及还没有创建成容器的镜像C

  1. 创建一个网络,起名为 “ **my_net ” **

docker network create my_net

  1. 将名为A的容器加入网络

docker network connect my_net A

  1. 将名为B的容器加入到网络

docker network connect my_net B

  1. 也可以在容器创建启动的时候直接加入到网络中,比如C镜像创建成容器

docker run -d --name C -p 8080:8080 --network my_net **IMAGE_NAME:TAG**

DockerCompose

DockerCompose通过一个单独的docker-compose.yml模板文件来定义一组相关联的应用容器,帮助我们实现多个相互关联的docker容器的快速部署。

image.png
举一个例子:

version: "3.8"
services:
	mysql:
  	image: mysql
  	container_name: mysql
  	ports:
    	- "3306:3306"
    evironment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: xxxxxxx
    volumes:
      - "./mysql/conf:/etc/mysql/conf.d"
      - "./mysql/data:/var/lib/mysql"
      - "./mysql/init:/docker-entrypoint-initdb.d"
    networks:
    - my_net
  spingboot_backend:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: my_backend
    ports:
      - "8080:8080"
    networks:
    	- hm-net
    depends_on:
      - mysql
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - "18080:18080"
      - "18081:18081"
    volumes:
      - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
      - "./nginx/html:/usr/share/nginx/html"
    depends_on:
    	- my_backend
    networks:
      - my_net
networks:
	my_net:
  	name: my_net

可以发现, dockercompose.yaml文件的很多地方与docker run 命令后面的那一大段类似。

**docker compose [OPTIONS] [COMMANDS]**
image.png

posted @ 2024-04-18 21:01  beiyuan666  阅读(15)  评论(0编辑  收藏  举报