参考链接
参考链接
参考链接
强烈安利,建议先把这个安装上,用curl安装,千万别用apt-get安装!
我之前用apt-get安装的后果是装上去不能用也就算了,甚至原来装的docker都玩崩了,即使把这个卸载也不行,心态爆炸。
$ docker version
$ docker-compose --version
建议先到Docker Hub搜索你要安装的镜像,比如搜索mysql,选择官方提供的镜像,找它的Tags,通俗理解为版本号,推荐选择5.7的版本,因为这个版本的mysql与其他技术组件的兼容性较好。
使用docker pull命令将镜像下载到本地
# docker pull [镜像名]:[Tags版本] #下载指定版本的镜像
# docker pull [镜像名] #下载最新版本的镜像等同于 docker pull [镜像名]:latest
$ docker pull mysql:5.7
$ docker images
# docker rmi [镜像名]:[Tags]
$ docker rmi mysql:5.7
1、背景
你想在原来的系统安装mysql5.7又心血来潮想安装mysql8.0+,各个配置文件位置,还有环境变量,想想头都大了,而且那天想删除个软件又删不干净,简而言之就是各个软件不好管理,这种痛苦对于大部分强迫症患者来说,无异于是在你耳边用手指甲划黑板。更可气的是,你这些安装卸载的操作,有时很可能导致之前的软件出现故障,疯狂查资料,一时之间又解决不了,有时候烦的直接回滚快照或者重装系统,淦!
2、什么是docker容器(container)?有什么好处?(可以看一下这篇文章)
你可以通俗的将docker容器理解为一个虚拟机。你在linux上运行了一个docker容器,就相当于你在wi10系统搞了个win7虚拟机,在win7虚拟机里面安装运行软件,你win10要管的只是管理win7虚拟机。虚拟机里面软件怎么胡来,对你win10系统不足为惧,不开心就把win7虚拟机给删了。(是不是有那味了?)
所以docker的好处就是你通过docker在系统上装软件,运行软件,不会对你原来的系统环境产生一些麻烦的影响。你主系统要做的只是管理docker 容器(虚拟机),至于软件运行就给docker容器(虚拟机)管啦。
而docker的优越性还在于他提供了一些命令能够统一管理你创建的多个容器,比如创建、删除、修改、查看你创建的容器。
有了docker之后,我想运行哪个软件,我只要事先下载好这个软件的镜像文件,让后通过这个镜像文件来在生成一个docker容器,就相当于创建了个虚拟机里面运行着那个软件。每一个docker容器,都相当于一个小型的虚拟机。因而每个docker容器运行互不干扰,也不会骚扰你主系统,除非你骚扰它。这就是我们说的docker隔离性很好。
即使这个docker容器被你玩坏了,或者之前配置的不好嫌弃了,直接一句命令删掉即可(docker rm),但之前下载的镜像还在,你只要通过这个镜像再创建一个docker容器就好了,十分的快速方便。
并且只要提供一个软件的镜像文件,就能创建多个相应的容器,比如我有一个mysql:5.7的镜像文件,我就能创建多个mysql5.7的容器:mysql-container01-3306、mysql-container02-3307…,并且同时运行(方便集群),你可以想用哪个用哪个,只需要配置好每个容器与主机的端口映射就好了。
接下来将介绍两种创建容器的方式:
$ docker run -d \
--name mysql-whyvent \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD=xxxxxx \
-v /home/software/Mysql/mysql-whyvent/conf:/etc/mysql/conf.d \
-v /home/software/Mysql/mysql-whyvent/logs:/var/log/mysql \
-v /home/software/Mysql/mysql-whyvent/data:/var/lib/mysql \
mysql:5.7
–name mysql-whyvent:表示给该容器起个名字mysql-whyvent
-p [主机端口]:[容器端口]:端口映射,将主机的端口与容器内部的端口映射起来,上例中访问主机的3307端口就能访问到你创建的mysql-whyvent容器
-e:表示配置该容器的环境变量,不同的docker镜像对应不同的环境变量,这个可以到Docker Hub搜索相应的镜像查看它的描述即可,以mysql的DockerHub为例,在他的描述下找到环境变量说明:MYSQL_ROOT_PASSWORD=xxxxxx 即表示配置mysql的root密码为xxxxxx
-v [主机文件路径]:[容器文件路径]:表示文件映射,将容器内的文件关联到主机上的某个位置的文件。这么做的原因是:比如你创建的mysql-whyvent容器运行了,但是没有搞文件映射,这时,你虽然能访问这个数据库,也能正常创库创表使用,但是你创的这些表啊,数据都保存到了这个容器内部的/var/lib/mysql文件下,你在主机环境下是无法直接获取这些文件的,除非你从容器内把文件拷出来(想象容器为虚拟机会好理解),这种做法很麻烦,命令为:(docker cp [容器名]:[容器文件路径] [主机文件路径])。所以一劳永逸的办法就是文件映射了。
[镜像名]:docker run 命令的最后一个属性为镜像名,表示用哪个镜像来创建容器。
说白了就是引用yaml文件里面设置的参数来创建容器,比第上一种方法好的是,你可以查看yaml文件获得创建容器的配置信息。
首先得安装一下docker-compose-参考链接
在你喜欢的目录下创建一个yaml文件,比如:docker-compose.yaml
version: "3.8"
services:
mysql: #服务名
container_name: mysql-whyvent #容器名称
ports: #端口映射
- "3307:3306"
environment: #环境变量配置
- MYSQL_ROOT_PASSWORD=xxxxxx
volumes: #文件映射
- /home/software/Mysql/mysql-atguigu/conf:/etc/mysql/conf.d
- /home/software/Mysql/mysql-atguigu/logs:/var/log/mysql
- /home/software/Mysql/mysql-atguigu/data:/var/lib/mysql
image: mysql:5.7 #镜像选择
# docker-compose -f [yaml文件路径] up -d # 创建容器
$ docker-compose -f docker-compose.yaml up -d
# docker logs [容器名或ID]
$ docker logs mysql-whyvent
因为做了文件映射,所以也可以到主机映射的logs目录下查看
# 查看正在运行的容器
$ docker ps
# 查看所有创建的容器
$ docker ps -a
# docker stop [容器名或ID] #停止运行的容器
$ docker stop mysql-whyvent
# docker start [容器名或ID] #启动容器
$ docker start mysql-whyvent
# docker restart [容器名或ID] #重新启动容器
$ docker restart mysql-whyvent
# docker rm [容器名或ID] #删除创建的容器
$ docker rm mysql-whyvent
只有正在运行的容器,才能进入其内部,以mysql为例
进入mysql-whyvent容器内部
# docker exec -it [容器名或ID] /bin/bash
$ docker exec -it mysql-whyvent /bin/bash
进入容器内部后,你可以/var/lib/mysql目录下找到这个数据库容器创建的图表
也可以登录进mysql控制台,使用相关命令操作,exit退出;从容器内部退出到主机也用exit:
当一个容器没有显式声明网络环境时,启动后会默认被加入到xxx_default网络中:
# 查看docker网络环境
$ docker network ls
可以通过docker network inspect 命令查看docker网络配置
# docker network inspect [容器网络环境名] #查看docker网络配置
$ docker network inspect mysql-whyvent_defalut
所以你默认创建的容器其实是各自运行在各自的网络中的,自然,一个容器是无法关联另一个容器的。
这时候,networks就来了,networks通常应用于集群服务,从而使得不同的应用程序得以在相同的网络中运行,从而解决网络隔离问题。
接下来就以nacos+mysql来实现nacos配置持久化来说明一个容器如何关联另一个容器。
当我们需要一个容器关联另一个容器,比如说nacos的配置持久化就需要关联一个mysql数据库,这时候就需要mysql容器和nacos容器都统一到同一个网络环境中。所以,首先我们要创建一个它们共用的虚拟网络环境net-docker。
# docker network create [网络名] --driver bridge
$ docker network create net-docker --driver bridge
这时候查看docker网络环境,就存在了net-docker
修改mysql的docker-compose.yaml文件:
version: "3.8"
services:
mysql: #服务名
container_name: mysql-whyvent #容器名称
ports: #端口映射
- "3307:3306"
environment: #环境变量配置
- MYSQL_ROOT_PASSWORD=xxxxxx
volumes: #文件映射
- /home/software/Mysql/mysql-whyvent/conf:/etc/mysql/conf.d
- /home/software/Mysql/mysql-whyvent/logs:/var/log/mysql
- /home/software/Mysql/mysql-whyvent/data:/var/lib/mysql
image: mysql:5.7 #镜像选择
networks: #关联到网络环境net-docker
default:
external:
name: net-docker
然后用doker-compose创建mysql容器,参考2.2.3
$ docker-compose -f docker-compose.yaml up -d
运行成功后,要在数据库中创建nacos数据库名称为:nacos,下面要引用。
这个数据库表的sql语句在nacos1.3的版本:nacos/conf/nacos-mysql.sql中。
修改nacos的nacos-standalone-mysql-5.7.yaml文件:
version: "3.8"
services:
nacos:
image: nacos/nacos-server:latest
container_name: nacos-whyvent
env_file:
- nacos-standlone-mysql.env
volumes:
- /home/software/Nacos/nacos-whyvent/logs:/home/nacos/logs
- /home/software/Nacos/nacos-whyvent/init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
external_links: #关联容器外的 MySQL
- mysql-whyvent
restart: on-failure
networks: #配置和mysql容器互通的网络net-docker
default:
external:
name: net-docker
修改nacos的yaml文件中指定的环境变量配置文件nacos-standlone-mysql.env:
PREFER_HOST_MODE=hostname
MODE=standalone # nacos的运行模式为standalone
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=xxx.xxx.xxx.xxx #因为mysql-whyvent容器做了端口映射,所以这里的地址可以直接写主机的本地ip地址
MYSQL_SERVICE_DB_NAME=nacos #nacos持久化到mysql对应的图名称:nacos
MYSQL_SERVICE_PORT=3307
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=xxxxxx
然后用docker-compose创建nacos容器:
$ docker-compose -f nacos-standalone-mysql-5.7.yaml up -d
接下来访问http://xxx.xxx.xxx.xxx:8849/nacos测试持久化配置应该是没毛病的。
通过容器提交镜像(docker commit)以及推送镜像(docker push)
我创建了一个common仓库,仓库名为:whyvent/common
以mysql容器mysql-whyvent为例:
# docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
# -a :提交的镜像作者;
# -c :使用Dockerfile指令来创建镜像;
# -m :提交时的说明文字;
# -p :在commit时,将容器暂停。
$ docker commit -a "whyvent" -m "mysql for whyvent" whyvent/common:mysql-whyvent
再次查看镜像,镜像whyvent/common:mysql-whyvent已经提交到本地了。
# docker push [OPTIONS] NAME[:TAG]
# OPTIONS说明:
# --disable-content-trust :忽略镜像的校验,默认开启
$ docker push whyvent/common:mysql-whyvent
这样在自己的DockerHub仓库就可以看到上传的镜像了,你提交容器的环境变量配置就是该镜像的默认环境变量:
1、Docker官方
2、Docker菜鸟教程
3、docker-compose安装nacos
4、浅谈docker-compose网络设置之networks
5、通过容器提交镜像(docker commit)以及推送镜像(docker push)笔记