Docker

2023-12-13 09:56:55

目录

1?安装Docker

1.1?安装yum工具

1.2?卸载旧版

1.3?删除旧版数据

1.4?安装依赖包

1.5 添加Docker的yum源(使用阿里云镜像)

1.6?配置缓存

1.7?安装最新稳定版Docker

1.8?验证安装

?编辑

1.9 配置镜像加速器

1.10?启动Docker

1.11?验证启动

2?Docker中部署Mysql

2.1?镜像仓库

2.2?Mysql镜像下载

2.3?运行Mysql镜像

3 Docker常见命令

3.1?操作镜像

3.2?操作容器

3.3?操作数据卷

3.4?操作网络

4?数据卷

4.1?数据卷与容器挂载

4.2?宿主机与容器挂载

5?自定义镜像

5.1?镜像结构

5.2?Dockerfile

5.3 Dockerfile指令

5.4?自定义镜像

5.4.1?拉取Ubuntu或centos

5.4.2?准备文件

5.4.3?自定义java17镜像包

5.4.4?自定义jar包镜像

6?网络

6.1?网桥

6.2?自定义网络

7 DockerCompose

7.1?docker-compose.yml

7.2 DockerCompose命令

7.3?注意事项


1?安装Docker

1.1?安装yum工具

yum?install -y?yum-utils? ?//别复制,用手打

1.2?卸载旧版

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

1.3?删除旧版数据

sudo rm -rf /var/lib/docker

1.4?安装依赖包

sudo yum install -y yum-utils \
? device-mapper-persistent-data \
? lvm2

1.5 添加Docker的yum源(使用阿里云镜像)

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

1.6?配置缓存

sudo yum makecache fast

1.7?安装最新稳定版Docker

sudo yum install -y docker-ce

1.8?验证安装

docker -v? //查看docker安装版本

1.9 配置镜像加速器

????????本文使用网易163加速器,也可以选择阿里云加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
? "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF

1.10?启动Docker

# 启动docker

sudo?systemctl?start?docker

# 停止docker

sudo?systemctl?stop?docker

# 重启docker

sudo?systemctl?restart?docker

# 设置开机自启

sudo?systemctl?enable?docker

1.11?验证启动

docker?images

2?Docker中部署Mysql

2.1?镜像仓库

? ? ? ? 用于存放和管理镜像的平台,例如网易云镜像仓库、阿里云镜像仓库等

2.2?Mysql镜像下载

? ? ? ? 使用Docker安装应用时,Docker会先找本地镜像(image),如果没有就自动在"镜像仓库"搜索并下载镜像(镜像不仅包含应用本身,还包含应用运行所需的环境、配置、系统函数库等)

? ? ? ? Docker中的镜像应用不用真的安装,因为下载是一堆已经安装好的文件,下载即用(相当于windows的"绿色免安装"应用)

2.3?运行Mysql镜像

? ? ? ? Docker在运行镜像时会依据镜像创建一个环境隔离的容器(container),一个镜像可以创建多个容器

docker run -d --name mysql_container_3306?-p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

多开容器??docker run -d --name mysql_container_3307?-p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 mysql

????????docker?run? //创建运行一个容器,-d是让容器在后台运行(所有docker命令都是以docker开头)

????????--name? //给容器起名(必须唯一)

????????-p? //设置端口映射 [宿主机端口]:[容器端口]

? ? ? ? -e? //(enviroment) -e KEY:VALUE

? ? ? ? mysql? //镜像名字,完整写法是[镜像名]:[版本号],如果没写版本号,默认代表最新版本

3 Docker常见命令

Docker文档可以在(https://docs.docker.com)查看

Docker镜像信息可以在(https://hub-stage.docker.com)搜索后查看

当docker命令不会写时,可以通过--help获取帮助,例如docker?save --help查看"将镜像打包成压缩文件"的命令

如果复制的本文命令不生效,可以尝试自己手打命令

3.1?操作镜像

docker?pull? //从"镜像仓库"下载镜像

docker?images? //查看已经下载的镜像

docker?rmi? //删除镜像(如果有容器在被使用,要先删除容器)

? ? ? ? docker?rmi?镜像id

? ? ? ? docker?rmi?镜像名:版本号(latest)

docker?build? //先定义DOCKERFILE,然后构件自定义镜像

docker?save? //将镜像打包成压缩文件,保存到宿主机

? ? ? ? docker?save -o?nginx.tar?nginx:latest? //将nginx:latest打成nginx.tar,保存到宿主机的当前目录下

docker?load? //将宿主机的压缩镜像包文件加载到docker中,生成一个镜像

? ? ? ? docker?load -i?nginx.tar? //加载镜像包文件? -i指定加载哪个镜像包

docker?push? //将本地镜像上传到"镜像仓库"

3.2?操作容器

docker?run??//创建运行一个容器(如果docker中没有对应的镜像,就从"镜像仓库"下载镜像)

? ? ? ? docker?run -d --name?nginx_container_81 -p 81:80?nginx

docker?start?容器名? //启动一个容器

docker?stop?容器名??//停止一个容器

docker?ps? //查看所有运行中的容器? ? ??docker?ps -a? //查看所有容器

docker?rm? //删除容器

? ? ? ? docker?rm?容器id/容器名 -f? //-f表示强制删除,不需要先停止容器

docker?exec? //查看容器内部

? ? ? ? docker?exec -it?容器名?bash??//-it表示创造一个"可交互终端",此后的操作都是在环境隔离的容器中的操作? ? ?exit退出容器回到宿主机

? ? ? ? ? ? ? ? docker?exec -it?mysql?bash? //进入mysql容器中? 然后通过mysql -uroot -p连入容器中的mysql? ?第一次exit退出容器中的mysql回到容器,第二次exit退出容器回到宿主机

docker?inspect?容器名? //查看容器详细信息,挂载信息(Mounts):如果Type是volume,就表示"数据卷与容器挂载";如果Type是bind,就表示"宿主机与容器挂载"

? ? ? ? ? ? ? ? 网络信息(Networks)

docker?log -t?容器名? //查看容器日志(比如查看jar包运行日志)? //Ctrl+C退出日志

3.3?操作数据卷

docker?volume?ls? //查看所有卷

docker?volume?inspect?卷名??//查看某个卷详情

docker?volume?create? //创建卷

docker?volume?rm?卷名? //删除卷(要确保没有容器使用该卷)

3.4?操作网络

docker?network?ls? //查看所有网络

docker?network?create?网络名? //创建网络

docker?network?connect?网络名?容器名? //将(已经存在的)容器加入到网络中

????????docker?run -d --name engineering_container_81 -p 81:80 --network?网络名?engineering_image??//创建容器时就加入到网络中(如果创建容器不加入网络,就会默认加入bridge网桥;?如果创建容器加入网络,就只会加入选定网桥,不会再加入默认的bridge网桥)

docker?notwork?disconnect?网络名?容器名? //使指定容器离开网络

docker?network?rm?网络名? //删除网络

docker?network?inspect?网络名? //查看网络详细信息(查看连入此网络有哪些容器)

4?数据卷

? ? ? ? 数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁

? ? ? ? 卷一创建,宿主机的目录就会自动创建,因此只需要将卷与容器目录挂载就可以了

4.1?数据卷与容器挂载

? ? ? ? "数据卷与容器挂载",新建的数据卷在宿主机的位置固定/var/lib/docker/volumes/数据卷名/_data目录

????????通过docker?run -v?数据卷名:容器内目录完成数据卷挂载(创建容器时,如果挂载了数据卷且数据卷不存在时,会自动创建数据卷)? //挂载必须是在创建容器时,如果容器已将创建就不能再挂载数据卷

? ? ? ? ? ? ? ? docker run -d --name nginx_container_81 -p 81:80 -v html_volume:/usr/share/nginx/html nginx? ?//数据卷与nginx容器的静态资源目录挂载

4.2?宿主机与容器挂载

? ? ? ? 如果创建容器时没有指定挂载,那容器就会自动创建一些匿名卷,在宿主机上的保存位置依旧是/var/lib/docker/volumes/匿名卷名/_data

? ? ? ? 可以宿主机的自定义目录容器目录挂载,docker?run -v?宿主机目录:容器内目录,宿主机目录要使用绝对路径(以/开头,或以./开头表示当前目录),不要使用相对路径(相对路径会被认为是"数据卷与容器挂载")

? ? ? ? ? ? ? ? (1) 在宿主机的root目录下新建docker_mysql目录,进入目录再分别创建data、conf、init目录,分别与docker中mysql的数据(即使mysql容器被摧毁,数据依旧在宿主机上持久保存)、配置文件、初始化脚本(创建容器执行的sql)目录进行挂载

? ? ? ? ? ? ? ? (2)?将my.cnf上传到conf目录,将sql脚本上传到init目录

############################### my.cnf
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

############################### init.sql
CREATE DATABASE `sunner`;

CREATE TABLE sunner.`teacher` (
  `position` varchar(10) DEFAULT NULL,
  `name` varchar(10) DEFAULT NULL,
  `age` int DEFAULT NULL
);

? ? ? ? ? ? ? ? (3)?docker?run -d --name?mysql_container_3307 -p 3307:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /root/docker_mysql/data:/var/lib/mysql -v /root/docker_mysql/init:/docker-entrypoint-initdb.d -v /root/docker_mysql/conf:/etc/mysql/conf.d?mysql

5?自定义镜像

5.1?镜像结构

? ? ? ? 基础镜像(BaseImage):系统函数库、环境、配置等

? ? ? ? 层(Layer):在基础镜像的基础上,将大家通用的依赖、配置等打包成一个镜像,供其他镜像依赖

? ? ? ? 入口(Entrypoint):镜像运行入口,一般是程序的脚本和参数(例如:java -jar?xx.jar)

5.2?Dockerfile

? ? ? ? Dockerfile是一个文本文件,其中包含了一个个指令(Instruction),用来构件镜像

? ? ? ? 每条指令都必须为大写字母且后面跟随至少一个参数

? ? ? ? 指令按照从上到下顺序执行(#表示注解)

? ? ? ? 每条指令都会创建一个新的镜像层,并对镜像进行提交(即"镜像叠镜像",然后得到一个最终镜像)

5.3 Dockerfile指令

FROM?指定基础镜像

RUN?容器构建(docker?build...)时需要运行的shell命令

WORKDIR?创建容器(docker?run...)后,当前窗口默认处在容器中的哪个文件夹

ENV?key:value结构,在构建镜像环境中设置环境变量(可以在Dockerfile中被用$引用)

COPY?拷贝文件或目录到镜像中

ADD COPY+解压(会自动解压tar压缩包)

ENTRYPOINT?容器运行时调用

5.4?自定义镜像

? ? ? ? docker?build -t?镜像名:版本号(不填默认latest)?Dockerfile目录(当前目录用.)

5.4.1?拉取Ubuntu或centos

docker?pull?centos:7

5.4.2?准备文件

? ? ? ? (1)?下载jdk安装包(jdk-17.0.9_linux-x64_bin.tar.gz)

? ? ? ? (2)?上传jdk安装包到linux

? ? ? ? (3)?与jdk安装包同级目录下,新建Dockerfile文件

# 建立一个新的镜像文件,配置模板:新建立的镜像是以centos为基础模板
FROM centos:7
 
# 创建一个新目录来存储jdk文件
RUN mkdir /usr/local/java
WORKDIR /usr/local/java
 
#将jdk压缩文件复制到镜像中,它将自动解压缩tar文件
ADD jdk-17.0.9_linux-x64_bin.tar.gz  /usr/local/java/
 
# 创建软连接 ln -s 源文件 目标文件
# RUN ln -s /usr/local/java/jdk-17.0.9 /usr/local/java/jdk
 
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk-17.0.9
ENV JRE_HOME /usr.local.java/jdk-17.0.9
ENV CLASSPATH .:${JAVA_HOME}/LIB:${JRE_HOME}/LIB
ENV PATH $JAVA_HOME/bin:$PATH

5.4.3?自定义java17镜像包

docker?build -t?jdk17_image .

5.4.4?自定义jar包镜像

? ? ? ? (1)?准备jar包(demo.jar)

? ? ? ? (2)?准备Dockerfile文件

# 基础镜像
FROM jdk17_image
# 设定是去
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#拷贝jar包
COPY demo.jar /demo.jar
#入口
ENTRYPOINT ["java","-jar","/demo.jar"]

? ? ? ? (3)?docker?build -t?demo_image .

? ? ? ? (4)?通过demo_image镜像生成并运行容器

? ? ? ? ? ? ? ? docker?run -d --name?demo_container_81 -p 81:80?demo_image

6?网络

6.1?网桥

????????docker各个容器之间是相互隔离的,但各个容器之间可以通过网桥相互连接

? ? ? ? 可以通过ip?addr命令查看linux的网卡,其中docker0网卡是docker创建时就有的,对应默认的bridge网桥(默认网桥中,容器之间只能通过被分配的IP访问)

6.2?自定义网络

? ? ? ? 创建自定义网络后,docker会生成一个新的网桥,加入此网桥的容器之间能通过容器名互联

7 DockerCompose

7.1?docker-compose.yml

? ? ? ? 之前通过Dockerfile的部署,都是一个个的单独部署,无法体现项目的整体性

? ? ? ? 可以通过docker-compose.yml(YAML格式)文件来定义一组相关联的容器,实现多个相互关联的的Docker容器快速部署

version: "1.2"

networks:
#  网络标识
  sunner_network:
#    网络名
    name: s_n
services:
  mysql:
    image: mysql
    container_name: mysql_container_3306
    ports:
      - "3306:3306"
    environment:
      TZ: Asia/Shanghai
# 这个密码只适用于初次创建镜像,后续即使再创建新镜像密码也不会变(因为对/var/lib/mysql进行了数据绑定,新的mysql镜像用的还是老数据)
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "/root/docker_mysql/data:/var/lib/mysql"
      - "/root/docker_mysql/init:/docker-entrypoint-initdb.d"
      - "/root/docker_mysql/conf:/etc/mysql/conf.d"
    networks:
      - sunner_network
  redis:
    image: redis
    container_name: redis_container_6379
    ports:
      - "6379:6379"
    volumes:
      - "/root/docker_redis/data:/home/redis/myredis/data"
      - "/root/docker_redis/redis.conf:/home/redis/myredis/redis.conf"
    networks:
      - sunner_network
  engineering_image:
    build:
      context: .
#     Dockerfile文件名
      dockerfile: Dockerfile_engineering
    container_name: engineering_container_80
    ports:
      - "80:80"
    volumes:
#   jar包运行日志输出文件夹与宿主机文件夹挂载
      - "/root/sunnerLogs/engineering:/dev/sunnerLogs/engineering"
    networks:
      - sunner_network
    depends_on:
      - mysql
      - redis
#  nginx:
#    image: nginx_image
#    container_name: nginx_container
#    ports:
#      - "18080:18080"
#      - "18081:18081"
#    volumes:
#      - "/root/docker_nginx/nginx.conf:/etc/nginx/nginx.conf"
#      - "/root/docker_nginx/html:/usr/share/nginx/html"
#    depends_on:
#      - engineering_image
#    networks:
#      - sunner_network

7.2 DockerCompose命令

docker?compose [OPTIONS] [COMMAND]

? ? ? ? OPTIONS:

? ? ? ? ? ? ? ? -f?指定compose文件的路径和名称? ? //当前目录下可以省略

? ? ? ? ? ? ? ? -p?指定project名称? ? //不指定默认root

? ? ? ? COMMAND:

? ? ? ? ? ? ? ? up?创建并启动所有所有service容器? ? //不会对docker中已经有的镜像更新,如果想更新需要先删除对应镜像,然后再执行up命令

? ? ? ? ? ? ? ? down?停止并移除所有容器、网络

? ? ? ? ? ? ? ? ps?查看所有与project有关的已启动的容器

? ? ? ? ? ? ? ? start?启动容器

? ? ? ? ? ? ? ? stop?停止容器

? ? ? ? ? ? ? ? restart?重启容器

? ? ? ? ? ? ? ? top?查看运行的进程

? ? ? ? ? ? ? ? exec?在指定的运行着的容器中执行命令

例:docker?compose?up -d

7.3?注意事项

? ? ? ? 执行docker compose命令需要在docker-compose.yml所在目录下执行,否则会报错

docker-compose: command not found

文章来源:https://blog.csdn.net/SunnerChen/article/details/134310497
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。