Docker学习和安装
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、Docker指引
- 1.LINUX虚拟机升级,准备
- 2.安装docker
- 二、使用步骤
- 3.docker命令分类
- 4.Docker容器(container)
- Docker容器常用命令
- 5.安装相关软件
- 1.nginx
- 2.安装mysql
- 3.安装Zookeeper
- 4.ActiveMQ
- 三、Docker 核心原理
- 1. docker网络
- 1.bridge网络
- 1. 新建bridge网络
- 2.none网络
- 3.host网络
- 2.网络命令汇总
- 2.Docker数据卷(必须掌握)
- 1.数据卷
- 3.docker-compose(编排工具,用处很多)
- 反向代理案例
- 4.安装Docker私服
- 4.1.habor企业私服
- 5.Dockerfile
- 1.**基于已有的镜像创建**
- 2.Dockerfile的基本结构
- 6.将本地微服务项目部署
- 7.idea集成docker
- 总结
一、Docker指引
1.LINUX虚拟机升级,准备
docker官网:https://www.docker.com
官方文档地址:https://docs.docker.com/
虚拟机 | ip |
---|---|
CenOS7 -4 | 192.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.2ping 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将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的,而且容器之间我们希望能够实现数据共享。
特点:
- 数据卷可以在容器之间共享或重用数据
- 数据卷中的更改可以立即生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷默认会一直存在,即使容器被删除
- 数据卷的生命周期一直持续到没有容器使用它为止
容器中的管理数据主要有两种方式:
- 数据卷: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.数据卷
数据卷类型(推荐大家使用 宿主机数据卷 方式持久化数据)
有三种数据卷类型:
- 宿主机数据卷:直接在宿主机的文件系统中但是容器可以访问(bind mount)
- 命名的数据卷:磁盘上Docker管理的数据卷,但是这个卷有个名字。
- 匿名数据卷:磁盘上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.27.4
https://github.com/docker/compose - 授权
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
- 卸载
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 tomcat2docker 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/ /datadocker cp tomcat:/usr/local/tomcat/webapps /data/tomcat1/webapps
docker cp tomcat:/usr/local/tomcat/webapps /data/tomcat2/webappsecho "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.confupstream 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-alpinecontainer_name: lagou-nginxrestart: alwaysports:- 80:80volumes:- /data/nginx:/etc/nginxlagou-tomcat1:image: tomcat:9.0.20-jre8-alpinecontainer_name: lagou-tomcat1restart: alwaysports:- 8081:8080volumes:- /data/tomcat1/webapps:/usr/local/tomcat/webappsdepends_on:- lagou-nginxlagou-tomcat2:image: tomcat:9.0.20-jre8-alpinecontainer_name: lagou-tomcat2restart: alwaysports:- 8082:8080volumes:- /data/tomcat2/webapps:/usr/local/tomcat/webappsdepends_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.136 | Docker私服 |
CenOS 7-04(node3) | 192.168.142.134 | Docker主机 |
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
安装版本
软件 | 版本 |
---|---|
docker | 18.06 |
docker -compose | 1.27.4 |
harbor | 1.9.4 |
tar zxf harbor-offline-installer-v1.9.4.tgz2.进入安装目录
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/harborvolumecd /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 创建镜像主要有三种:
- 基于已有的镜像创建;
- 基于 Dockerfile 来创建;
- 基于本地模板来导入;
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_dmodatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.142.132:3306/lagou?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: adminjpa:database: MySQLshow-sql: truehibernate: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:v1docker 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
总结
Docker学习和安装相关推荐
- 【原】Docker学习_安装篇(一)
CentosDocker安装 来源:https://www.runoob.com/docker/centos-docker-install.html 1.前提条件 目前,CentOS 仅发行版本中的内 ...
- docker学习4-docker安装mysql环境
前言 docker安装mysql环境非常方便,简单的几步操作就可以了 拉取mysql镜像 先拉取mysql的镜像,可以在docker的镜像仓库找到不同TAG标签的版本https://hub.docke ...
- docker学习5-docker安装tomcat环境和部署war包
下载tomcat镜像 [root@bogon data]# docker pull tomcat Using default tag: latest latest: Pulling from libr ...
- docker学习-1CentOS安装Docker CE
1 moby.docker-ce与docker-ee docker原是一个开源项目,主要由docker公司维护,2017年年初,docker公司将原先的docker项目改名为moby,并创建了dock ...
- [转]Docker学习之四:使用docker安装mysql
本文转自:https://blog.csdn.net/qq_19348391/article/details/82998391 Docker学习之一:注册Docker Hub账号 Docker学习之二 ...
- Docker学习一:Docker简介与安装
前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...
- docker学习(一)在centos7上安装与启动docker
CentOS Docker 安装 1.Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本 前提条件 目前,CentOS ...
- Docker学习笔记 之 Docker安装配置使用
简介 Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare met ...
- Docker学习笔记——(一)docker简介与docker安装
Docker简介与安装 1. Docker简介 docker是什么? docker架构原理 docker有什么用? docker容器与虚拟机的区别 虚拟机与Docker的体系结构说明: 整体对比: 2 ...
最新文章
- android+ip+rule+策略路由,策略路由以及使用 ip route , ip rule , iptables 配置策略路由实例...
- PV、UV、IP的区别
- linux下安装glibc-2.14,解决“`GLIBC_2.14‘ not found”问题
- 已安装内存和可用内存不一致 4GB内存在win1064位系统中显示为可用 3.87GB解决办法
- 20211126 为什么转动惯量矩阵是正定的?
- 修改Linux网卡由eth1变成eth0
- 原生js追加html代码,原生js实现给指定元素的后面追加内容
- saltstack 主题说明
- 一文带你理解Java中Lock的实现原理
- 前端基础:学习 ES6 新特性
- 解决: libcimtd.lib not found, rpcndr.lib not found
- PyTorch 1.0 中文文档:数据类型信息
- 消息中间件学习总结(1)——RocketMQ之专访RocketMQ联合创始人:项目思路、技术细节和未来规划
- 宅在家里写数据库中DQL(查询)
- BZOJ3223 文艺平衡树
- python的计算_基于python实现的计算器
- 判断一个数是否为素数(质数) c语言
- MATLAB 绘制空间分布图,颜色代表数值(替代ArcGIS)
- SpringBoot 访问web中的静态资源
- 一文详解谷歌最新物联网操作系统 Android Things,话说还记得大明湖畔的Fuchsia吗?
热门文章
- 方舟找不到mod服务器了,方舟生存进化灭绝MOD全图文攻略 方舟灭绝MOD上手指南_MOD介绍及服务器设置_游侠网...
- 发现没有一篇宝宝的日记
- MongoDB面试题(史上最全面试题,精心整理100家互联网企业,面试必过)
- dom4j在指定位置添加标签更新标签
- ILRuntime-CLR重定向数据类型
- 爬取抖音粉丝数据1(作品、喜欢、ID 、关注) 完整源代码
- 抖音表情号内容制作方法,项目特点技巧分享,变现方法如何?
- centos上配置node环境变量
- Angular父组件调用子组件里面的方法
- Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析