Docker学习和安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、Docker指引

1.LINUX虚拟机升级,准备

在这里插入图片描述
docker官网:https://www.docker.com
官方文档地址:https://docs.docker.com/

虚拟机ip
CenOS7 -4192.168.142.132

将Centos系统从7.0~7.7升级到7.8版本https://www.cnblogs.com/emanlee/p/13594584.html

CentOS 更新yum源为阿里云源和epel源
https://blog.csdn.net/bluerebel/article/details/93513903

升级系统内核

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm yum --enablerepo=elrepo-kernel install -y kernel-lt 
grep initrd16 /boot/grub2/grub.cfg 
grub2-set-default 0 
#重启
reboot

查看centos系统内核命令:

uname -r
uname -a
#查看CPU命令
lscpu
#查看内存命令
free
free -h
#查看硬盘信息
fdisk -l

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭selinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux setenforce 0

网桥过滤

vi /etc/sysctl.conf 

net.bridge.bridge-nf-call-ip6tables = 1 
net.bridge.bridge-nf-call-iptables = 1 
net.bridge.bridge-nf-call-arptables = 1 net.ipv4.ip_forward=1 net.ipv4.ip_forward_use_pmtu = 0 

#生效命令 
sysctl --system

命令补全

#安装bash-completion 
yum -y install bash-completion bash-completion-extras 
#使用bash-completion 
source /etc/profile.d/bash_completion.sh

上传文件

yum -y install lrzsz 
1.鼠标拖拽上传文件 
2.下载文件 
 2.1下载一个文件 sz filename 
 2.2下载多个文件 sz filename1 filename2 
 2.3下载dir目录下所有文件,不包含dir下的文件夹 sz dir/*

2.安装docker

阿里云开发者平台
开发者平台官网地址:可以参考阿里云官网提供的docker安装教程进行安装。
https://www.aliyun.com/

二、使用步骤

安装docker前置条件

yum install -y yum-utils device-mapper-persistent-data lvm2

添加源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum makecache fast

查看docker版本

yum list docker-ce --showduplicates | sort -r

安装docker

#安装最新版:推荐大家安装最新版本 
yum -y install docker-ce 
#安装指定版本: 语法规则:yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io 
yum -y install docker-ce-18.06.3.ce-3.el7 docker-ce-cli.x86_64 
yum install -y docker-ce-19.03.9-3.el7 docker-ce-cli-19.03.9-3.el7(只安装这个,只复制执行这个命令)

开启dock而服务

systemctl start docker
systemctl status docker

在这里插入图片描述

安装阿里云镜像加速器
镜像加速器地址https://takw5tc6.mirror.aliyuncs.com

mkdir -p /etc/docker 
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://takw5tc6.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload 
systemctl restart docker

#docker命令
docker -v 
docker version
docker info

设置docker开机启动服务

systemctl enable docker

3.docker命令分类

https://hub.docker.com/
官网地址
https://docs.docker.com/engine/reference/run/
在这里插入图片描述
1.tag命令

docker tag tomcat:9.0.20-jre8-alpine lagou/tomcat:9

2.rmi命令

docker rmi tomcat:9.0.20-jre8-alpine 
docker image rm tomcat:9.0.20-jre8-alpine

3.清理镜像

docker image prune

4.Docker容器(container)

Docker容器(container)
容器是镜像的运行时实例。正如从虚拟机模板上启动 VM 一样,用户也同样可以从单个镜像上启动一个或多个容器。虚拟机和容器最大的区别是容器更快并且更轻量级——与虚拟机运行在完整的操作系统之上相比,容器会共享其所在主机的操作系统/内核。下图为使用单个 Docker镜像启动多个容器的示意图。

在这里插入图片描述

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是镜像的一个运行实例。
可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。
容器是基于镜像启动起来的,容 器中可以运行一个或多个进程。
镜像是Docker生命周期 中的构建或打包阶段,而容器则是启动或执行阶段。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。

Docker容器常用命令

1.新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

运行容器(将宿主机的8080端口和容器的8080端口进行映射)

docker run -it --rm -p 8080:8080 tomcat:9.0.20-jre8-alpine

8080:8080 : 后代表容器内的端口号;前面代表宿主机的端口号
在这里插入图片描述
另一种后台启动方式
由于–rm和 -d不能同时用,所以重新命名一个容器

docker run -itd --name tomcat9 -p 8899:8080 tomcat:9.0.20-jre8-alpine 

运行第二个tomcat:container名字和端口都要换

(可忽略)进入容器内部操作(不是在虚拟机里面)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210705100307196.png

docker exec -it b149319d5d64  /bin/bash

2.容器日志

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine 
docker logs -f tomcat9

3.删除容器

#需要先停止运行中的容器再删除,否则无法删除容器
docker stop tomcat9(docker start tomcat9)
#按照容器名称删除 
docker rm tomcat9 (-f 强制删除)
#按照容器ID删除 
docker rm 8dd95a95e687

4.列出容器

docker run -itd --name tomcat9 -p 8080:8080 tomcat:9.0.20-jre8-alpine 
查看运行中的容器 
docker ps (tomcat9 )
查看所有容器 
docker ps -a (tomcat9)

输出详情介绍:
CONTAINER ID: 容器 ID。
IMAGE: 使用的镜像。
COMMAND: 启动容器时运行的命令。
CREATED: 容器的创建时间。
STATUS: 容器状态。
状态有7种:

  • created(已创建)
  • restarting(重启中)
  • running(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)
    PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
    NAMES: 自动分配的容器名称。

常用参数
-a :显示所有的容器,包括未运行的。
-q :只显示容器编号。

实用技巧

停止所有运行容器 
docker stop $(docker ps -qa) 
删除所有的容器 
docker rm $(docker ps -aq) 
docker rm $(docker stop $(docker ps -q)) 
删除所有的镜像 
docker rmi $(docker images -q)

5.创建容器
docker create :创建一个新的容器但不启动它。用法同 docker run命令。

docker create -it --name tomcat9 -p 8080:8080 9.0.20-jre8-alpine

6.启动、重启、终止容器

docker start(name/id) :启动一个或多个已经被停止的容器
docker stop :停止一个运行中的容器
docker restart :重启容器

7.进入容器(常见)

#有bash命令的linux系统:例如centos 
docker run -it --name tomcat9.1 -p 8080:8080 tomcat:9.0.20-jre8-slim
docker exec -it tomcat9.1 /bin/bash 
#没有bash命令的linux系统:例如alpine系统
docker run -itd --name tomcat9.2 -p 8081:8080 tomcat:9.0.20-jre8-alpine 
docker exec -it tomcat9.2 sh

8.更新容器

更新容器restart策略 
docker update --restart always tomcat9

9.杀掉容器

docker kill tomcat9

常用命令
在这里插入图片描述

5.安装相关软件

1.nginx

下载地址https://hub.docker.com/_/nginx?tab=tags&page=1&ordering=last_updated&name=1.19.3
在这里插入图片描述

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine 
docker exec -it nginx sh
查看html目录 
cd /usr/share/nginx/html 
配置文件目录 
cat /etc/nginx/nginx.conf

2.安装mysql

下载地址https://hub.docker.com/_/mysql

docker run -itd --name mysql --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.31 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

netstat -nap | grep 3306查看端口占用
sudo kill 2683 杀掉进程

停止mysql开机服务自启动 systemctl disable mysqld.service
在这里插入图片描述

3.安装Zookeeper

下载地址https://hub.docker.com/_/zookeeper

docker pull zookeeper:3.6.2

备份镜像,导入镜像

#备份镜像
docker save zookeeper:3.6.2 -o zookeeper.3.6.2.tar 
#导入镜像
docker load -i zookeeper.3.6.2.tar

安装

docker run -itd --name zookeeper --restart always -p 2181:2181 zookeeper:3.6.2 

4.ActiveMQ

下载地址https://hub.docker.com/r/webcenter/activemq

docker pull webcenter/activemq:5.14.3
docker run -itd --name activmq --restart always -p 61616:61616 -p 8161:8161 webcenter/activemq:5.14.3

三、Docker 核心原理

什么是虚拟化
如果要对物理资源进行管理,第一步,就是“虚拟化”。虚拟化是云计算的基础。简单来说,虚拟化就是在一台物理服务器上,运行多台“虚拟服务器”。这种虚拟服务器,也叫虚拟机(VM,VirtualMachine)。

  • 物理机,通常称为“宿主机(Host)”
  • 虚拟机,则称为“客户机(Guest)”。

人们在使用虚拟化一段时间后,发现它存在一些问题,不同的用户,有时候只是希望运行各自的一些简单程序,跑一个小进程。为了不相互影响,就要建立虚拟机。如果建虚拟机,显然浪费就会有点大,而且操作也比较复杂,花费时间也会比较长。而且,有的时候,想要迁移自己的服务程序,就要迁移整个虚拟机。显然,迁移过程也会很复杂。安装的虚拟机越多,消耗的资源对应越多。
环境兼容性问题,开发时的环境运行正常,部署到虚拟机环境进行测试则有可能发生错误。

有没有办法更灵活快速一些呢?有,这就引入了“容器(Container)

什么是容器

容器就是在隔离环境运行的一个进程,如果进程停止,容器就会销毁。隔离的环境拥有自己的系统文件,IP地址,主机名等。容器也是虚拟化,但是属于“轻量级”的虚拟化。它的目的和虚拟机一样,都是为了创造“隔离环境”。但是,它又和虚拟机有很大的不同——虚拟机是操作系统级别的资源隔离,而 容器本质上是进程级的资源隔离

1. docker网络

docker安装后会自动创建3种网络:

  • bridge
  • host
  • none
docker network ls

1.bridge网络

docker network inspect bridge 

在这里插入图片描述

查看docker0网络,在默认环境中,一个名为docker0的linux bridge自动被创建好了,其上有一个 docker0 内部接口,IP地址为172.17.0.1/16 
ip a 
查看docker 网络 
docker network ls 
查看bridge网络详情。主要关注Containers节点信息。
docker network inspect bridge

Docker 创建一个容器的时候,会执行如下操作:

  • 创建一对虚拟接口/网卡,也就是veth pair,分别放到本地主机和新容器中;
  • 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 vetha596da4;
  • 容器一端放到新容器中,并修改名字作为 eth0,这个网卡/接口只在容器的名字空间可见;
  • 从网桥可用地址段中(也就是与该bridge对应的network)获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 vetha596da4。
第一种方式: docker exec -it nginx sh ip a 
第二种方式: docker exec -it nginx ip a

安装brctl

yum install -y bridge-utils
运行命令
brctl show

多容器之间通讯

docker run -itd --name nginx1 nginx:1.19.3-alpine 
docker run -itd --name nginx2 nginx:1.19.3-alpine 
docker network inspect bridge 
docker exec -it nginx1 sh 
ping 172.17.0.2 

docker exec -it nginx2 sh 
ping 172.17.0.2

ping www.baidu.com 
ping nginx1

在这里插入图片描述
通过绑定ens33这个网卡访问外网
在这里插入图片描述
在这里插入图片描述
问题:由于每次重启都会依赖ip地址,所以使用link依赖容器名而不依赖IP地址(参考)
link容器(已经不推荐)

docker run -itd --name nginx2 --link nginx1 nginx:1.19.3-alpine

上面link命令,是在nginx2容器启动时link到nginx1容器,因此,在nginx2容器里面可以ping通nginx1容器名,link的作用相当于添加了DNS解析。这里提醒下,在nginx1容器里去ping nginx2容器是不通的,因为link关系是单向的,不可逆。

实际工作中,docker官网已经不推荐我们使用link参数。

docker用其他方式替换掉link参数

1. 新建bridge网络
docker network create -d bridge lagou-bridge

在这里插入图片描述
在这里插入图片描述
指定网络启动

docker run -it --name nginx3 --network lagou-bridge nginx:1.19.3-alpine

把一个运行中容器连接到lagou-bridge网络

docker network connect lagou-bridge nginx2 (nginx2横跨了bridge和lagou-bridge新的网络)
docker network inspect lagou-bridge 

docker exec -it nginx2 sh 
ping nginx3 

docker exec -it nginx3 sh 
ping nginx2

2.none网络

准备干净环境

docker rm -f ${docker ps -aq}
docker network rm lagou-bridge 
docker network ls

指定none网络启动

docker run -itd --name nginx1 --network none nginx:1.19.3-alpine

在这里插入图片描述
进入容器查看

docker exec -it nginx1 sh

在这里插入图片描述
因此无法和外网进行访问,保密级别高(军官,银行)

3.host网络

docker run -itd --name nginx2 --network host nginx:1.19.3-alpine 
docker network inspect host

查看网络

docker exec -it nginx2 sh 
ip a

容器使用了host模式,说明容器和外层linux主机共享一套网络接口

2.网络命令汇总

容器分配固定ip

补充:
172.172.0.0/24: 24代表子码掩码是255.255.255.0
172.172.0.0/16: 16 代表子码掩码

docker network create -d bridge  --subnet  172.172.0.0/24 --gateway 172.172.0.1 lagou-network

在这里插入图片描述

docker run -itd --name nginx4 -p 80:80 --network lagou-network --ip 172.172.0.10 nginx:1.19.3-alpine 

docker network inspect lagou-network 
#停了重启观察ip是否变化
没有变化

在这里插入图片描述

2.Docker数据卷(必须掌握)

准备

docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:5.7.31 --character-set-server=utf8 --collation-server=utf8_general_ci

什么是数据卷
当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们删除docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享。

特点:

  1. 数据卷可以在容器之间共享或重用数据
  2. 数据卷中的更改可以立即生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷默认会一直存在,即使容器被删除
  5. 数据卷的生命周期一直持续到没有容器使用它为止

容器中的管理数据主要有两种方式:

  • 数据卷:Data Volumes 容器内数据直接映射到本地主机环境
  • 数据卷容器:Data Volume Containers 使用特定容器维护数据卷

docker cp :用于容器与主机之间的数据拷贝。

[root@node3 data]# echo "lagouedu laosiji  say hello" > index.html
[root@node3 data]# cat index.html 
lagouedu laosiji  say hello
[root@node3 data]# docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
e62d1073a882dc990f2311c42389b89fac1f673fbe72fbcc7680bd62c6ececfd
#把宿主机内容拷贝到容器
[root@node3 data]# docker cp index.html  nginx:/usr/share/nginx/html/index.html

把容器内容拷贝到宿主机

docker cp nginx:/etc/nginx/nginx.conf /docData/

1.数据卷

数据卷类型(推荐大家使用 宿主机数据卷 方式持久化数据)
有三种数据卷类型:

  1. 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
  2. 命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
  3. 匿名数据卷:磁盘上Docker管理的数据卷,因为没有名字想要找到不容易,Docker来管理这些文件。
docker run -v /宿主机绝对路径目录:/容器内目录 镜像名

bind mounts

docker run -itd --name mysql --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql mysql:5.7.31 --character-set-server=utf8 --collation-server=utf8_general_ci

数据覆盖问题

  • 如果挂载一个空的数据卷到容器中的一个非空目录中,那么这个目录下的文件会被复制到数据卷中
  • 如果挂载一个非空的数据卷到容器中的一个目录中,那么容器中的目录会显示数据卷中的数据。如果原来容器中的目录有数据,那么原始数据会被隐藏掉

挂载目录权限问题
下载地址 https://hub.docker.com/r/sonatype/nexus3

docker pull sonatype/nexus3:3.28.1
备份镜像 
docker save sonatype/nexus3:3.28.1 -o sonatype.nexus3.3.28.1.tar 
导入镜像 
docker load -i sonatype.nexus3.3.28.1.tar

运行容器 
docker run -d -p 8081:8081 --name nexus3 sonatype/nexus3:3.28.1

查看密码
在这里插入图片描述

6ee03475-26bc-45ec-aabb-c599de962dbf

访问http://192.168.142.132:8081
在这里插入图片描述
修改密码为:123456

重新添加,进行目录挂载

docker rm $(docker stop $(docker ps -aq))
数据卷挂载 
docker run -itd -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/ sonatype/nexus3:3.28.1 
查看容器启动日志 
docker logs -f nexus3

这样启动会报错,因为要给目录授权
给目录授权

查看官网说明文档,需要为挂载目录授权
 chown -R 200 nexus3/ 
 运行容器
docker run -d -p 8081:8081 --name nexus3 -v /data/nexus3/:/nexus-data/ sonatype/nexus3:3.28.1

命名的数据卷
命名挂载方式

docker run -itd --name nginx -p 80:80 -v lagouedu-nginx:/etc/nginx nginx:1.19.3- alpine 
查看docker数据卷 
docker volume ls 
查看lagouedu-nginx宿主机目录 
docker volume inspect lagouedu-nginx 
进入docker数据卷默认目录 
cd /var/lib/docker/volumes/lagouedu-nginx

匿名数据卷

docker run -itd --name nginx -p 80:80 -v /etc/nginx nginx:1.19.3-alpine 
查看docker数据卷 
docker volume ls 
查看宿主机目录
docker volume inspect dbd07daa4e40148b11.... 
进入docker数据卷默认目录 
cd /var/lib/docker/volumes/dbd07daa4e40148b11.... 
查看文件 
ls
所有的文件docker默认保存在_data目录中 
cd _data

清理数据卷

docker volume ls 
清理数据卷 
docker volume prune 
docker volume ls

数据卷容器
run命令

docker run

–volumes-from:
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器
也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
发现创建好的数据卷容器是处于停止运行的状态,因为使用 —volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

在这里插入图片描述

docker pull centos:7.8.2003 
docker pull nginx:1.19.3-alpine 
docker pull mysql:5.7.31
docker run -d --name data-volume -v /data/nginx:/usr/share/nginx/html -v /data/mysql:/var/lib/mysql centos:7.8.2003
docker run -itd --name nginx01 -p 80:80 --volumes-from data-volume nginx:1.19.3-alpine 
echo "lagouedu nginx" > /data/nginx/index.html http://192.168.198.100 

docker run -itd --name nginx02 -p 81:80 --volumes-from data-volume nginx:1.19.3-alpine 
http://192.168.198.100:81
docker run -itd --name mysql01 --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31 -- character-set-server=utf8 --collation-server=utf8_general_ci 

docker run -itd --name mysql02 --restart always --privileged=true -p 3307:3306 -e MYSQL_ROOT_PASSWORD=admin --volumes-from data-volume mysql:5.7.31 -- character-set-server=utf8 --collation-server=utf8_general_ci

总结:nginx没问题,mysql有问题

3.docker-compose(编排工具,用处很多)

一键式部署
官网 https://docs.docker.com/compose/compose-file/

docker compose是什么
Docker Compose能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理。多数的现代应用通过多个更小的微服务互相协同来组成一个完整可用的应用。比如一个简单的示例应用可能由如下 4 个微服务组成:

  • Web前端。
  • 订单管理。
  • 品类管理。
  • 后台数据库。
    将以上服务组织在一起,就是一个可用的应用。

docker compose 的背景

Docker Compose 的前身是 Fig。Fig 是一个由 Orchard 公司开发的强有力的工具,在当时是进行多容器管理的最佳方案。
Fig 是一个基于 Docker 的 Python工具,允许用户基于一个 YAML 文件定义多容器应用,从而可以使用fig 命令行工具进行应用的部署。

docker compose安装(需要安装和授权)

  1. 下载:下载最新版本:1.27.4
    https://github.com/docker/compose
  2. 授权
mv /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 
cp /data/docker-compose-Linux-x86_64 /usr/local/bin/docker-compose 
chmod +x /usr/local/bin/docker-compose 
开发环境可以授予最高权限 
chmod 777 /usr/local/bin/docker-compose

查看安装

docker-compose -v
docker-compose version
  1. 卸载
rm -rf /usr/local/bin/docker-compose 
reboot

yml配置文件及常用指令

Docker Compose 的 YAML 文件包含 4 个一级 key:version、services、networks、volumes

  • version 是必须指定的,而且总是位于文件的第一行。它定义了 Compose 文件格式(主要是API)的版本。注意,version 并非定义 Docker Compose 或 Docker 引擎的版本号。

  • services 用于定义不同的应用服务。上边的例子定义了两个服务:一个名为 lagou-mysql数据库服务以及一个名为lagou-eureka的微服。Docker Compose 会将每个服务部署在各自的容器中。

  • networks 用于指引 Docker 创建新的网络。默认情况下,Docker Compose 会创建 bridge 网络。
    这是一种单主机网络,只能够实现同一主机上容器的连接。当然,也可以使用 driver 属性来指定不同的网络类型。

  • volumes 用于指引 Docker 来创建新的卷。

反向代理案例

mkdir -p /data/tomcat1 tomcat2

docker run -itd --name nginx -p 80:80 nginx:1.19.3-alpine
ocker run -itd --name tomcat -p 8080:8080 tomcat:9.0.20-jre8-alpine
docker cp nginx:/etc/nginx/ /data

docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1/webapps 
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2/webapps

echo "tomcat1" > /data/tomcat1/webapps/ROOT/index.jsp 
echo "tomcat2" > /data/tomcat2/webapps/ROOT/index.jsp 

docker rm -f nginx tomcat

修改nginx.conf

nginx.conf
增加内容 include vhost/*.conf;

反向代理配置

mkdir -p /data/nginx/vhost 
cd vhost 
vi lagouedu.com.conf

upstream nginxlagouedu{ 
  server 192.168.142.132:8081; 
  server 192.168.142.132:8082; 
 }
server{
  listen 80; 
  server_name 192.168.142.132; 
  autoindex on; 
  index index.html index.htm index.jsp;
   location / { 
   proxy_pass http://nginxlagouedu;
   add_header Access-Control-Allow-Origin *; 
   } 
 }

docker-compose
在idea中安装docker插件后,新建docker-compose.yml中编写

version: '3'
services:
  lagou-nginx:
   image: nginx:1.19.3-alpine
   container_name: lagou-nginx
   restart: always
   ports:
     - 80:80
   volumes:
     - /data/nginx:/etc/nginx
  lagou-tomcat1:
   image: tomcat:9.0.20-jre8-alpine
   container_name: lagou-tomcat1
   restart: always
   ports:
     - 8081:8080
   volumes:
     - /data/tomcat1/webapps:/usr/local/tomcat/webapps
   depends_on:
     - lagou-nginx
  lagou-tomcat2:
     image: tomcat:9.0.20-jre8-alpine
     container_name: lagou-tomcat2
     restart: always
     ports:
       - 8082:8080
     volumes:
       - /data/tomcat2/webapps:/usr/local/tomcat/webapps
     depends_on:
       - lagou-nginx

启动服务

docker-compose up 
docker-compose up -d #后台启动

测试

http://192.168.142.132:8081/
http://192.168.142.132:8082/
 http://192.168.142.132

停止服务

docker-compose down

列出所有运行容器

docker-compose ps

查看服务日志

docker-compose logs

构建或者重新构建服务

docker-compose build

启动服务

docker-compose start

停止已运行的服务

docker-compose stop

重启服务

docker-compose restart

4.安装Docker私服

虚拟机ip作用
CenOS 7-05(node7)192.168.142.136Docker私服
CenOS 7-04(node3)192.168.142.134Docker主机

https://hub.docker.com/_/registry
拉取镜像

docker pull registry:2.7.1

安装

docker run -itd -p 5000:5000 --name registry --restart=always registry:2.7.1

测试地址:http://192.168.142.136:5000/v2/_catalog

上传镜像

docker tag nginx:1.19.3-alpine  192.168.142.136:5000/nginx:v1

在这里插入图片描述
添加私服仓库地址

vim /etc/docker

{“阿里云镜像地址”,
 "insecure-registries":["192.168.142.136:5000"] }
重启
systemctl daemon-reload 
systemctl restart docker
查看docker信息确认仓库是否添加
docker info

再次尝试push
docker push 192.168.142.136:5000/nginx:v1

在这里插入图片描述
浏览器查看http://192.168.142.136:5000/v2/nginx/tags/list

镜像下载

docker pull 192.168.142.136:5000/nginx:v1

4.1.habor企业私服

harbor官网地址: https://goharbor.io/

在这里插入图片描述
github官网地址:https://github.com/goharbor/harbor
安装版本

软件版本
docker18.06
docker -compose1.27.4
harbor1.9.4
tar zxf harbor-offline-installer-v1.9.4.tgz

2.进入安装目录 
cd harbor 
3.修改配置文件 
vi harbor.yml 
3.1修改私服镜像地址 
hostname: 192.168.198.101 
3.2修改镜像地址访问端口号 
port: 5000 
3.3harbor管理员登录系统密码(amdin)
harbor_admin_password: Harbor12345 
3.4修改harbor映射卷目录 
data_volume: /data/harborvolume

cd /install/harbor
./install.sh

访问地址:http://192.168.142.136:5000

配置私服(上面实践时已配置过)

vi /etc/docker/daemon.json 
"insecure-registries":["192.168.142.132:5000"] 
重启docker服务: 
systemctl daemon-reload 
systemctl restart docker

在这里插入图片描述
将镜像上传到lagouedu

先登录私服,再上传

docker login -u admin -p Harbor12345 192.168.142.136:5000

在这里插入图片描述
上传镜像

 docker push 192.168.142.136:5000/lagouedu/nginx:v1 

在这里插入图片描述

5.Dockerfile

,我们将学习 Docker 如何创建镜像?Docker 创建镜像主要有三种:

  1. 基于已有的镜像创建;
  2. 基于 Dockerfile 来创建;
  3. 基于本地模板来导入;

1.基于已有的镜像创建

commit命令
docker commit :从容器创建一个新的镜像。
在这里插入图片描述

docker run -itd --name nginx -p 80:80 192.168.142.136:5000/lagouedu/nginx:v1 

echo "laosiji" > /data/index.html
docker cp /data/index.html nginx:/usr/share/nginx/html/index.html
制作镜像
docker container commit -m "update index.html file" -a "qch" nginx 192.168.142.136:5000/lagouedu/nginx:v2

验证从远处仓库下载

docker run -itd --name nginx -p 80:80 192.168.142.136:5000/lagouedu/nginx:v2

2.Dockerfile的基本结构

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行
Dockerfile分为四部分:基础镜像信息、维护者信息、 镜像操作指令和容器启动时执行指令

Dockerfile常见命令
在这里插入图片描述
例子
修改mysql官网镜像时区
在这里插入图片描述

FROM mysql:5.7.31
MAINTAINER mysql from date UTC by Asia/Shanghai "qch@lagou.com"
ENV TZ Asia/Shanghai

在这里插入图片描述
build命令
docker build 命令用于使用 Dockerfile 创建镜像。
在这里插入图片描述
“ .” 表示当前目录有个默认的文件叫Dockerfile

cd /data/docFile_mysql
docker build --rm -t 192.168.142.136:5000/lagouedu/mysql:5.7 .

push该镜像到私服

docker push 192.168.142.136:5000/lagouedu/mysql:5.7

运行镜像

docker run -itd --name mysql --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin 192.168.142.136:5000/lagouedu/mysql:5.7 

mysql docker exec -it mysql bash 
date
 观察时间是否与windows系统的时间一致。

6.将本地微服务项目部署

<build>
        <finalName>${project.name}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

2.注意使用username而非name

server:
  port: 8083
spring:
  application:
    name: docker_dmo
  datasource:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.142.132:3306/lagou?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
      username: root
      password: admin
  jpa:
      database: MySQL
      show-sql: true
      hibernate:
       naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #避免将驼峰命名转换为下划线命名

3.mvn clean package 打包
4.目录上点击输入cmd,脱离idea发布
在这里插入图片描述
5.启动harbor:./install.sh
登录密码: Harbor12345
在这里插入图片描述

6.对mysql进一步优化:优化mysql镜像
docker-entrypoint-initdb.d
在这里插入图片描述

新建文件夹上传lagou.sql
在这里插入图片描述
制作Dockerfile 放在sql的同级目录下

FROM mysql:5.7.31
MAINTAINER mysql from date UTC by Asia/Shanghai "qch@lagou.com"
ENV TZ Asia/Shanghai
COPY lagou.sql /docker-entrypoint-initdb.d

在这里插入图片描述
制作镜像

docker build --rm -t 192.168.142.132:5000/lagouedu/mysql:5.7.1 .
docker run -itd --name mysql --restart always --privileged=true -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -v /data/mysql:/var/lib/mysql 192.168.142.132:5000/lagouedu/mysql:5.7.1 --character-set-server=utf8 --collation-server=utf8_general_ci

不能导出数据库,只能导表:待解决
已解决:1.(不可用)mysql命令导出数据
2、换成sqlYog导数据库sql
上传镜像到harbor

docker push 192.168.142.132:5000/lagouedu/mysql:5.7.1

7.打包微服务镜像

docker pull openjdk:8-alpine3.9
docker save openjdk:8-alpine3.9 -o jdk8.tar 
docker load -i jdk8.tar

Dockerfile

FROM openjdk:8-alpine3.9
# 作者信息
MAINTAINER qch Docker springboot "qch@lagou.com"
# 修改源
RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" >/etc/apk/repositories && \
   echo "http://mirrors.aliyun.com/alpine/latest-stable/community/" >>/etc/apk/repositories
# 安装需要的软件,解决时区问题
RUN apk --update add curl bash tzdata && \
   rm -rf /var/cache/apk/*
#修改镜像为东八区时间
ENV TZ Asia/Shanghai 
ARG JAR_FILE 
COPY ${JAR_FILE} app.jar 
EXPOSE 8083 
ENTRYPOINT ["java","-jar","/app.jar"]

上传jar包和dockerfile文件
在这里插入图片描述

构建镜像
不要忽略后面的那个”·“

docker build --rm -t lagou/dockerdemo:v1 --build-arg JAR_FILE=docker_demo.jar .

在这里插入图片描述
启动镜像

docker run -itd --name dockername -p 8083:8083 lagou/dockerdemo:v1 

在这里插入图片描述
把镜像上传到harbor

docker tag lagou/dockerdemo:v1  192.168.142.136:5000/lagouedu/dockerdemo:v1

docker push 192.168.142.136:5000/lagouedu/dockerdemo:v1

在这里插入图片描述
在这里插入图片描述

7.idea集成docker

修改docker-100服务器docker.service服务信息,允许其他主机远程访问100服务器的docker

vi /usr/lib/systemd/system/docker.service 
在ExecStart行最后增加,开放远程主机访问权限。
-H tcp://0.0.0.0:2375 
最后增加修改内容如下:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375

在这里插入图片描述

重启docker

systemctl daemon-reload
systemctl restart docker
查看docker进程,发现docker守护进程在已经监听2375的tcp端口 
ps -ef|grep docker 
查看系统的网络端口,检查tcp的2375端口,docker的守护进程是否监听 
netstat -tulp

在这里插入图片描述


总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值