【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。


一、Docker的安装与配置

1、docker概述

  • Docker是一个开源的应用容器引擎
  • 诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名Docker Inc)
  • Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上
  • 容器是完全使用沙箱机制,相互隔离
  • 容器性能开销极低

Docker可以运行在Windows、MAC、CentOS、UBUNTU等操作系统上

官网:https://www.docker.com

总结:Docker是一种容器技术,解决软件跨环境迁移的问题。


2、安装docker

在CentOS上安装Docker引擎:https://docs.docker.com/engine/install/centos/

  1. yum包更新到最新
yum update
# 更新yum软件包索引
yum makecache fast
  1. 安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils
# 或
yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 设置yum源
# 默认国外的镜像源(不推荐,十分慢)
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内阿里云的镜像源(推荐,下载速度快)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  1. 安装docker,出现输入的界面都按 y
yum install -y docker-ce
# 或
yum install -y docker-ce docker-ce-cli containerd.io
  1. 查看docker版本,验证是否成功
# 查看docker服务状态
systemctl status docker
# 如未开启,需要启动docker服务
systemctl start docker
# 查看docker版本
docker version
docker -v

如果执行 yum install -y docker-ce 报错:

failure: repodata/repomd.xml from docker-ce-stable: 【Errno 256】 No more mirrors to try.

解决办法:

执行 vim /etc/yum.repos.d/docker-ce.repo,把第一个baseurl中的$releasever改成7,然后保存退出重新安装即可。


3、docker架构

  • 镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像 ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可以看成一个代码控制中心,用来保存镜像。


4、配置镜像加速器

默认情况下,将从docker hub(https://hub.docker.com/)上下载docker镜像,速度太慢。一般都会配置国内的镜像加速器:

在这里我们用阿里云镜像加速器,登陆阿里云查看个人加速地址

注意:用阿里云加速地址时,每个人的加速器地址不同,然后在终端输入下面指令


image.png


image.png

加速器地址:https://xxxxxxxx.mirror.aliyuncs.com(每个人不一样,必须登录后获取镜像加速器)

您可以通过修改daemon配置文件/etc/docker/daemon.json来配置使用加速器

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 上面操作完成后查看是否配置成功
cat /etc/docker/daemon.json





二、Docker命令

可配合菜鸟教程的Docker进行学习:https://www.runoob.com/docker/docker-command-manual.html


1、服务相关命令

  • 启动docker 服务:
systemctl start docker
  • 停止docker 服务:
systemctl stop docker
  • 重启docker 服务:
systemctl restart docker
  • 查看docker服务状态:
systemctl status docker
  • 设置开机启动docker服务:
systemctl enable docker


2、镜像相关命令

  • 查看镜像:查看本地所有的镜像
docker images
docker images -q #查看所有镜像的id
  • 搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
  • 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看
docker pull 镜像名称
  • 删除镜像:删除本地镜像
docker rmi 镜像id/名称号:版本号    # 删除指定本地镜像
docker rmi `docker images -q`     # 删除所有本地镜像

去docker官方查看维护可供下载的镜像版本号:https://hub.docker.com/

docker支持redis的版本


3、容器相关命令

  • 查看容器
docker ps        # 查看正在运行的容器
docker ps -a     # 查看所有容器
  • 创建并启动容器
# /bin/bash可加可不加,默认为/bin/bash(针对CentOS 7 镜像而言,非redis)。--name与容器名 用=或空格连接
docker run 参数 --name=容器名 版本:版本号 /bin/bash

参数说明:

-i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭

-t:为容器重新分配一个伪输入终端,通常与-i同时使用

-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭

-it创建的容器一般称为交互式容器;-id创建的容器一般称为守护式容器

--name:为创建的容器命名

注意:如果想要启动已关闭退出的容器,需要先docker start 容器名,之后再exec。

  • 进入容器
docker exec 参数     # 退出容器,容器不会关闭
docker exec -it c2 /bin/bash     # 例
  • 停止容器
docker stop 容器名称
  • 启动容器
docker start 容器名称
  • 删除容器:如果容器是运行状态,则删除失败,需要停止容器才能删除
docker rm 容器名称
  • 查看容器信息
docker inspect 容器名称




三、Docker容器数据卷

1、数据卷概念及作用

思考

(1)Docker 容器删除后,在容器中产生的数据还在吗?

答案:不存在,当容器被删除后,容器中产生的数据将一并被删除。

(2)Docker 容器和外部机器可以直接交换文件吗?

答案:外部机器可以与宿主机进行文件交换,但不能直接和宿主机内的容器进行交互。

(3)容器之间想要进行数据交互?

答案:将容器中的目录挂载到宿主机的数据卷目录,可以实现容器目录数据与宿主机数据卷目录数据同步。如果多个容器之间想要实现数据交互,只需将多个容器挂载同一个目录,实现多个容器的通信。

数据卷

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

数据卷的作用

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


2、配置数据卷

  • 创建启动容器时,使用-v参数 设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...

注意事项:

  1. 目录必须是绝对路径
  2. 如果目录不存在,会自动创建
  3. 可以挂载多个数据卷

将宿主机data目录与容器内的data_container进行绑定挂载

宿主机内/root/data目录会被创建

容器内/root/data_container目录也会自动创建

注:容器内部出现权限问题 在创建容器时添加 --privileged=true就可以了

复制一个宿主机Session,模拟多端操作

宿主机data创建文件,容器data_container同步创建

容器data_container创建并写入文件,宿主机data同步创建并已写入

删除容器c1,data_container随之删除,但宿主机data目录及里面的数据仍存在

重新创建容器并挂载宿主机的data目录,data_container重新获取data里面的数据,实现了容器数据持久化

一个容器可以挂载多个目录

案例:两个容器挂载同一个目录,实现两个容器的通信

宿主机的data目录和c3容器的data_c3目录进行挂载

复制一个宿主机Session,模拟多端操作

第二个会话中创建c4容器,将容器内的data_c4目录同样挂载到宿主机的data目录,并且写入数据到itcast.txt文件中

在第一个会话中,c3容器的data_c3同步过来了c4容器创建的文件和数据,实现了两个容器之间的数据交互。


3、配置数据卷容器

数据卷容器,方便挂载,例如有10个目录要挂载到多个容器,建立一个数据卷容器,把10个目录挂载后,其它容器就直接挂载到数据卷容器即可,不用每个容器重新写10条挂载的命令了。

多容器进行数据交换:

  1. 多个容器挂载同一个数据卷
  2. 数据卷容器

c1、c2、c3 都和宿主机设置了数据卷,其中 c3 是一个数据卷容器节点

配置数据卷容器:

  • 创建启动c3数据卷容器,使用-v参数 设置数据卷
docker run -it --name=c3 -v /volume centos:7 /bin/bash
  • 创建启动c1 c2容器,使用--volumes-from参数,后面加上要设置挂载的数据卷容器
docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash
docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

HostConfig的Binds下可查看数据卷挂载配置

Mounts下可以查看具体的挂载情况,比如源目录(宿主机目录)目的目录(容器内目录)

设置c3为数据卷容器,容器数据卷目录为/volume(名字随意)

克隆会话

查看c3挂载细节

设置c1挂载的数据卷容器为c3,此时c1容器中也创建了volume

克隆会话

设置c2挂载的数据卷容器为c3,此时c2容器中也创建了volume

此时c1、c2、c3已经相互通了,在c3中创建文件

c1中的volume文件夹中也创建了该文件

c2中的volume文件夹中也创建了该文件,同理,它们其中任意一个对其进行了更新,其他都会进行同样的修改更新

查看c1,c2的挂载细节,和数据卷容器c3的挂载目录一样,相当于在c3创建了宿主机目录的快捷方式,然后把快捷方式复制到了c1和c2,所以c3挂了也没影响,c1,c2仍可以通过数据卷和宿主机进行数据交换

数据卷小结

  1. 数据卷概念
  • 宿主机的一个目录或文件
  1. 数据卷作用
  • 容器数据持久化
  • 客户端和容器数据交换
  • 容器间数据交换
  1. 数据卷容器
  • 创建一个容器,挂载一个目录,让其他容器继承自该容器(--volume-from)。
  • 通过简单方式实现数据卷配置




四、Docker应用部署实战

1、部署MySQL

案例:在Docker 容器中部署MySQL,并通过外部MySQL客户端操作MySQL Server

问题及解决方案

  • 容器内的网络服务和外部机器不能直接通信
  • 外部机器和宿主机可以直接通信
  • 宿主机和容器可以直接通信
  • 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的端口,从而间接访问容器的服务
  • 这种操作称为:端口映射

实现步骤:

  1. 搜索mysql镜像
docker search mysql
  1. 拉取mysql镜像
docker pull mysql:5.7
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
# 创建容器,并设置端口映射、目录映射
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

参数说明:

  • -p 3307:3306:将容器的3306端口映射到宿主机的3307端口
  • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.cnf挂载到容器/etc/mysql/my.cnf配置目录
  • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs目录日志
  • -v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql数据目录
  • -e MYSQL_ROOT_PASSWORD=123456:初始化root 用户密码
  1. 使用外部机器访问并操作容器中的MySQL

可以看到宿主机的conf、data、logs目录全部挂载成功并自动创建,由于宿主机的data目录挂载到了容器的/var/lib/mysql数据目录,因此访问data可以看到容器内部/var/lib/mysql的数据目录情况,包含了刚刚创建的db1数据库。

2、部署Tomcat

案例:在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。

实现步骤:

  1. 搜索tomcat镜像
docker search tomcat
  1. 拉取tomcat镜像
docker pull tomcat
  1. 创建容器,设置端口映射、目录映射
# 在/root目录下创建tomcat目录用于存放tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
# 创建容器,并设置端口映射、目录映射
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat

参数说明:

  • -p 8080:8080:将容器的8080端口映射到主机的8080端口
  • -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps
  1. 部署项目

  1. 使用外部机器访问Tomcat


3、部署Nginx

案例:在Docker容器中部署Nginx,并通过外部机器访问Nginx。

实现步骤:

  1. 搜索Nginx 镜像
docker search nginx
  1. 拉取Nginx镜像
docker pull nginx
  1. 创建容器,设置端口映射、目录映射
#在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容
vim nginx.conf

在~/nginx/conf/下创建nginx.conf文件,粘贴下面代码块的内容

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
        
    include /etc/nginx/conf.d/*.conf;
}

配置完之后继续设置端口映射和目录映射

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

参数说明:

  • -p 80:80:将容器的80端口映射到宿主机的80端口
  • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的/conf/nginx.conf挂载到容器的:/etc/nginx/nginx.conf配置目录
  • -v $PWD/html:/usr/share/nginx/html:将主机当前目录挂载到容器的/val/log/nginx日志目录
  1. 使用外部机器访问nginx


4、部署Redis

需求:在Docker容器中部署Redis,并通过外部机器访问Redis。

实现步骤:

  1. 搜索Redis 镜像
docker search redis
  1. 拉取Redis 镜像
docker pull redis:5.0
  1. 创建容器,设置端口映射、目录映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
  1. 使用外部机器连接redis(Windows的redis-cli.exe客户端)
# redis-server 启动服务   ------>redis-cli 开启客户端   ctrl+c退出客户端
redis-cli.exe -h 192.168.8.100 -p 6379




五、Dockerfile

1、docker镜像原理

Docker 镜像原理:

操作系统组成部分:

进程调度子系统

进程通信子系统

内存管理子系统

设备管理子系统

文件管理子系统

网络通信子系统

作业控制子系统

Linux文件系统由bootfs 和rootfs 两部分组成

bootfs:包含bootloader(引导加载程序)和 kernel(内核)

rootfs:root文件系统,包含的就是典型的Linux 系统中的/dev、/proc、/bin等标准目录和文件

不同的Linux 发行版,bootfs 基本一样,而rootfs 不同,如Ubuntu,CentOS等

  • Docker 镜像是由特殊的文件系统叠加而成
  • 最低端是bootfs,并使用宿主机的bootfs
  • 第二层是root 文件系统rootfs ,称为base iamge
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

思考:

  1. Docker 镜像的本质是什么?
  • 是一个分层的文件系统
  1. Docker 中一个CentOS 镜像为什么只有200MB,而一个CentOS 操作系统的iso 文件要几个G?
  • CentOS的iso镜像文件包含bootfs和rootfs,而Docker的CentOS镜像复用操作系统的bootfs,只有rootfs和其他镜像层
  1. Docker 中一个Tomcat 镜像为什么有500MB,而一个Tomcat 安装包只有70多MB?
  • 由于Docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500多MB

2、容器转为镜像

Docker镜像如何制作?

镜像制作:

  1. 容器转为镜像
docker commit 容器id 镜像名称:版本号
  1. 将镜像打包成压缩文件
docker save -o 压缩文件名称 镜像名称:版本号
  1. 将镜像的压缩文件解压,还原成镜像
docker load -i 压缩文件名称

将id为9fd38d开头的tomcat容器转为镜像itheima_tomcat:1.0

commit后部分文件生效:在容器中自己添加的文件改变生效 但是在容器中挂载的目录文件不改变生效

将镜像打包成压缩文件

将镜像的压缩文件itheima_tomcat.tar解压,还原成镜像new_itheima_tomcat

启动镜像


3、dockerfile概述及关键字

Dockerfile 概念

  • Dockerfile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员,可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员,在部署时,可以实现应用的无缝移植

Dockerfile 关键字

关键字

作用

备注

FROM

指定父镜像

指定dockerfile基于哪个images构建

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 的时候添加文件到iamge 中,不仅仅局限于当前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 ENTRYPOINT执行的时候的用户

HEALTHCHECK

健康检查

指定监测当前容器的健康测试的命令 基本上没有 因为很多时候 应用本身由健康监测机制

ONBUILD

触发器

当存在ONBUILD 关键字的镜像作为基础镜像的时候 当执行FROM 完成之后 会执行ONBUILD的命令 但是不影响当前镜像 用处也不怎么大

STOPSIGNAL

发送信息量到宿主机

该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出

SHELL

指定执行脚本的shell

指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell


4、dockerfile实战案例

(1)使用dockerfile构建自定义CentOS镜像

案例一:自定义CentOS 7镜像

要求:

默认登录路径为/usr

可以使用vim

实现步骤:

  1. 定义父镜像:FROM centos:7
  2. 定义作者信息:MAINTAINER itheima
  3. 执行安装vim命令:RUN yum install -y vim
  4. 定义默认的工作目录:WORKDIR /usr
  5. 定义容器启动执行的命令:CMD /bin/bash
  6. 创建使用dockerfile的镜像:
docker build -f ./centos_dockerfile -t itheima_centos:1 .

创建一个docker-files文件夹,用来存放dockerfile文件

编辑dockerfile中的脚本信息

yum install是centos上的,ubuntu用 apt install

创建dockerfile中定义的镜像


(2)使用dockerfile部署springboot项目

在Win10本机编写完代码后,将项目打成jar包。

在本机上部署项目的jar包

测试运行没问题

将jar包从target目录下拷贝到外面

将jar包文件传输到Linux服务器

将项目jar包移动到docker-files目录下,完成准备工作

案例二:定义dockerfile,发布springboot项目

实现步骤:

  • 定义父镜像:FROM java:8
  • 定义作者信息:MAINTAINER itheima
  • 将jar包添加到容器:ADD springboot.jar app.jar
  • 定义容器启动执行的命令:CMD java -jar app.jar
  • 通过dockerfile 构建镜像:docker build -f dockerfile文件路径 -t 镜像名称:版本

FROM:引用的父镜像

MAINTAINER:作者信息

ADD:添加文件

CMD:执行命令

如果这里出现java:8找不到的错误,把java:8改为java:8-jdk

通过dockerfile构建镜像,将SpringBoot项目构建成可部署jar包的镜像

查看并运行该镜像的容器,端口映射为:服务器的9000端口映射容器内部的8080端口

由于没有指定容器name参数,系统自动分配容器名称

测试访问Linux服务器中docker部署的springboot项目容器。




六、Docker服务编排

1、服务编排概念

微服务架构的应用系统中一般包含若干个微服务,每个微服务都会部署多个实例,如果每个微服务都要手动启动停止,维护工作量会很大。

  • 要从Dockerfile build image 或者去 dockerhub 拉取image
  • 要创建多个container
  • 要管理这些container(启动停止删除)

服务编排 :按照一定的业务规则批量管理容器

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

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


2、docker compose安装与使用

注意这里安装的compose是1.x版本,如果参照官方文档安装的docker,应该已经安装过2.x版本的compose。2.x版本的compose验证版本号的命令为:docker compose --version

安装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
# 要安装其他版本的 Compose,请替换 v2.2.2。
# Docker Compose 存放在 GitHub,不太稳定。你可以也通过执行下面的命令,高速安装 Docker Compose。
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 设置文件可执行权限,将可执行权限应用于二进制文件:
chmod +x /usr/local/bin/docker-compose
# 创建软链:(可选非必须)
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本信息
docker-compose -version

卸载Docker Compose

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

3、案例:使用docker compose编排nginx+springboot项目

  1. 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
  1. 编写docker-compose.yml文件
version: '3'
services:
  nginx:
   iamge: 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;
    acess_log off;
        
    location / {
        proxy_pass https://app:8080;
    }
    
}

在~/docker-compose目录下 使用dockers-compose 启动容器

docker-compose up

测试访问:http://192.168.149.135/hello




七、Docker私有仓库

1、搭建私有仓库

Docker 私有仓库

Docker 官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。

私有仓库搭建

拉取私有仓库镜像

docker pull registry

启动私有仓库容器

docker run -id --name=registry -p 5000:5000 registry

打开浏览器,输入地址http://私有仓库服务器ip:5000/v2/_catalog看到{"repositories":[]}表示私有仓库搭建成功

http://192.168.8.100:5000/v2/_catalog

修改deamon.json

vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。
# 此步用于让docker信任私有仓库地址
# 注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}

重启docker 服务

systemctl restart docker
docker start registry

vim /etc/docker/daemon.json


2、上传镜像到私有仓库

  1. 标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7
  1. 上传标记的镜像
docker push 私有仓库服务器ip:5000/centos:7


3、从私有仓库拉取镜像

#拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7




八、Docker容器虚拟化与传统虚拟机比较

Docker容器虚拟化 与 传统虚拟机比较

容器就是将软件打包成标准化单元,以用于开发、交付和部署。

  • 容器镜像是轻量级的、可执行的独立软件包,包含软件运行所需要的所有内容:代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性,使其免受外在环境差异的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

相同:

  • 容器和虚拟机具有相似的资源隔离和分配优势。

不同:

  • 容器虚拟化的是操作系统,虚拟机虚拟化的是硬件。
  • 传统的虚拟机可以运行不同的操作系统,容器只能运行同一类型的操作系统。

特性

容器

虚拟机

启动

秒级

分钟级

磁盘使用

一般为MB

一般为GB

性能

接近原生

弱于

系统支持量

单机支持上千个容器

一般几十个



相关文章
|
3天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
122 75
|
10天前
|
NoSQL 关系型数据库 MySQL
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
109 56
《docker高级篇(大厂进阶):4.Docker网络》包括:是什么、常用基本命令、能干嘛、网络模式、docker平台架构图解
|
17天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
156 77
|
6天前
|
NoSQL 关系型数据库 应用服务中间件
docker基础篇:安装tomcat
docker基础篇:安装tomcat
111 64
|
8天前
|
关系型数据库 MySQL 数据库
docker高级篇(大厂进阶):安装mysql主从复制
docker高级篇(大厂进阶):安装mysql主从复制
66 24
|
9天前
|
NoSQL 算法 Redis
docker高级篇(大厂进阶):安装redis集群
docker高级篇(大厂进阶):安装redis集群
61 24
|
14天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
75 24
|
7天前
|
Ubuntu Linux Docker
Ubuntu22.04上Docker的安装
通过以上详细的安装步骤和命令,您可以在Ubuntu 22.04系统上顺利安装
94 11
|
3天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
16 4
|
16天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
94 6