Docker的使用
1、Docker是什么
docker是一个用来管理镜像的容器
容器(container):可以装东西
镜像( image ):所谓的镜像,你可以认为就是一个虚拟机
虚拟机:用软件代理硬件来模拟整个计算机的这样一套软件就成为 虚拟机
镜像说白了 你可以理解成 一台一台小型的Linux机器,只不过这个机器,没有硬件都是由软件来构成的…
管理:可以启动镜像(开机) 、关闭镜像、操作镜像,镜像就是一台一台的虚拟机
例如,利用Docker快速的安装了MySQL,非常的方便,不过我们执行的命令到底是什么意思呢?
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql
解读:
docker run -d:创建并运行一个容器,
-d
则是让容器以后台进程运行–name mysql : 给容器起个名字叫
mysql
,你可以叫别的-p 3306:3306 : 设置端口映射。
容器是隔离环境,外界不可访问。但是可以将宿主机端口****映射容器内到端口,当访问宿主机指定端口时,就是在访问容器内的端口了。
容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。
格式:
-p 宿主机端口:容器内端口
,示例中就是将宿主机的3306映射到容器内的3306端口-e TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数
格式:
-e KEY=VALUE
,KEY和VALUE都由容器内进程决定案例中,
TZ``=Asia/Shanghai
是设置时区;MYSQL_ROOT_PASSWORD=123
是设置MySQL默认密码mysql: 设置镜像名称,Docker会根据这个名字搜索并下载镜像
格式:
REPOSITORY:TAG
,例如mysql:8.0
,其中REPOSITORY
可以理解为镜像名,TAG
是版本号在未指定
TAG
的情况下,默认是最新版本,也就是mysql:latest
2、Docker能干什么(开发中)
1.安装服务:安装MySQL 安装MQ 安装Redis 安装ELK 安装Jenkins … 所有我们学习这写些服务软件我们是能安装的
2.项目的部署
3.项目的容器化部署
4.构建自己的镜像
3、Docker的基本安装
Docker的安装
一、安装docker
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
$ uname -r
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
$ sudo yum update
3、卸载旧版本(如果安装过旧版本的话)
$ sudo yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
$ yum list docker-ce --showduplicates | sort -r
7、安装docker
$ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
$ sudo yum install # 例如:sudo yum install docker-ce-17.12.0.ce
8、启动并加入开机启动
$ sudo systemctl start docker
$ sudo systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
$ docker version下载不了镜像就参考这个地址:https://blog.csdn.net/ytp552200ytp/article/details/139514548
3.1、Docker的镜像问题
要想自己构建镜像,必须先了解镜像的结构。
镜像之所以能让我们快速跨操作系统部署应用而忽略其运行环境、配置,就是因为镜像中包含了程序运行需要的系统函数库、环境、配置、依赖
因此,自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包而成
举个例子,我们要从0部署一个Java应用,大概流程是这样:
- 准备一个linux服务(CentOS或者Ubuntu均可)
- 安装并配置JDK
- 上传Jar包
- 运行jar包
那因此,我们打包镜像也是分成这么几步:
- 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
- 安装并配置JDK
- 拷贝jar包
- 配置启动脚本
上述步骤中的每一次操作其实都是在生产一些文件(系统运行环境、函数库、配置最终都是磁盘文件),所以镜像就是一堆文件的集合
但需要注意的是,镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer(层)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作
4、Docker的基本命令
https://blog.csdn.net/weixin_46028606/article/details/142663559
远程库的这个网站
https://hub-stage.docker.com/docker images :查看本地仓库的所有镜像
docker ps -a :查看正在运行的容器(容器:镜像启动之后的实例)
docker run -d -p 镜像对外提供服务的端口:宿主机的端口 镜像的名字:镜像版本号 —>这就是通用启动镜像的命令
docker stop 容器id :关机
docker rm 容器id 删除这个容器
docker exec -it 容器id /bin/bash :进入到容器的内部
docker rmi 镜像id :删除这个镜像
docker stop
docker ps -a
:将所有正在运行的容器全部关闭docker rm
docker ps -a
:删除所有的容器导出一个正在运行的容器镜像
docker export container1 > container1.tar导入一个镜像
docker import container1.tar container1:latest
补充:默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker# Docker容器开机自启
docker update --restart=always [容器名/容器id]
5、Docker下基本服务的安装
5.1、安装Tomcat
docker pull tomcat:8docker run -d -p 8888:8080 -v /usr/local/webapp:/usr/local/tomcat:webapps tomcat:8
5.2、安装MySQL
docker pull mysql:5.7docker run --name some-mysql -v /usr/local/docker-mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306 mysql:5.7
5.3、安装Redis
docker pull redis:5.0docker run -d -p 6379:6379 -v /usr/local/data/:/data redis:5.0 redis-server --appendonly yes
5.4、Nginx的使用
docker pull nginx:版本号docker run --name some-nginx -v /usr/local/nginx-content:/usr/share/nginx/html:ro -d -p 80:80 nginx:latest
6、Dockerfile的使用
这个是告诉我们如何构建自己的镜像
6.1、构建镜像第一种方式
先准备我们的资源数据
from centos:7 :从那个基础的镜像开始构建我们的镜像
maintainer xiaobobo :作者是谁
add jdk-8u161-linux-x64.tar.gz /usr/local :将前面的文件上传到镜像中并进行解压
add apache-tomcat-8.5.54.tar.gz /usr/local
env JAVA_HOME /usr/local/jdk1.8.0_161 :配置环境变量
env PATH J A V A H O M E : / b i n : JAVA_HOME:/bin: JAVAHOME:/bin:PATH
run cd /usr/local/apache-tomcat-8.5.54/webapps && rm -rf ROOT :运行咋们的Linux命令
add ROOT.war /usr/local/apache-tomcat-8.5.54/webapps/ :将前面的文件上传到镜像中的某一个位置不解压
cmd [“/usr/local/apache-tomcat-8.5.54/bin/catalina.sh”,“run”] :镜像启动的时候要执行的命令
6.2、构建镜像的第二种方式
from centos:7
maintainer xiaobobo
copy jdk-8u161-linux-x64.tar.gz /usr/local :这个命令表示的是只是复制不进行解压
run cd /usr/local && tar -zxvf jdk-8u161-linux-x64.tar.gz
copy apache-tomcat-8.5.54.tar.gz /usr/local
run cd /usr/local && tar -zxvf apache-tomcat-8.5.54.tar.gz
env JAVA_HOME /usr/local/jdk1.8.0_161
env PATH J A V A H O M E : / b i n : JAVA_HOME:/bin: JAVAHOME:/bin:PATH
run cd /usr/local/apache-tomcat-8.5.54/webapps && rm -rf ROOT
copy ROOT.war /usr/local/apache-tomcat-8.5.54/webapps/
expose 8080 :暴露某一个端口
entrypoint [“/usr/local/apache-tomcat-8.5.54/bin/catalina.sh”,“run”] :表示的是启动镜像执行的命令
注意
add:既要复制还要解压
copy:只是复制 不解压
expose:对外暴露端口
CMD:启动镜像的时候 执行的指令
entrypoint:启动镜像的时候 执行的指令
CMD和 entrypoint的区别是啥呢?
如果是有 多个 CMD指令和 多个 ENTRYPOINT指令的时候 CMD是有多个指令的之后 只会执行最后一个 ENTRYPOINT的话是所有的指令都要执行
6.3、还可以使用现成的Tomcat镜像来构建我们的项目
略
7、Docker-Compose的使用
比如我们在部署项目的时候 有 Tomcat(web项目) 有MySQL 还有 Nginx 那么这个时候 我们在部署这个项目的时候 那么一定有安装的先后顺序
Nginx---->Web项目----->依赖于MySQL
所以这个项目在一键部署的时候 就需要 先部署 MySQL 再部署 Web项目 最后才是 Nginx 这个逻辑才是对的
我们在部署项目的时候 确定部署的这个先后的顺序 其实有一个专业的名词 就叫做 容器的编排
Docker-compose他最重要的功能就是实现部署项目时候的容器编排 来解决启动的先后顺序
刚刚使用这个docker部署项目的时候 我们是单独部署的这个MySQL 现在我希望的是docker-compose 帮我们自动的将MySQL部署好 而不是单独的部署 web项目也是一样doker-compose帮我们去完成 不需要单独部署成项目
Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
7.1、安装docker-compose
#下载docker-compose文件
https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64#将文件复制到/usr/local/bin环境变量下面
mv docker-compose /usr/local/bin#给他一个执行权限
chmod +x /usr/local/bin/docker-compose#查看是否安装成功
docker-compose -version
7.2、启动docker-compose
7.3、docker-compose.yml 的这个文件
version: ‘2’
services:
web:
build: ./web
ports:
- “9786:8080”
container_name: ‘web’
depends_on:
- mysql
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
volumes:
- /usr/local/docker-compose-01/mysql/data:/var/lib/mysql
ports:
- “3307:3306”
container_name: ‘mysql’
或者
version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"networks:- new
networks:new:name: hmall
yaml文件的参数
编写好docker-compose.yml文件,就可以部署项目了
docker compose [OPTIONS] [COMMAND]
教学演示:
# 1.进入root目录
cd /root# 2.删除旧容器
docker rm -f $(docker ps -qa)# 3.删除hmall镜像
docker rmi hmall# 4.清空MySQL数据
rm -rf mysql/data# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 358B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster 15.4s=> [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3 0.0s=> [internal] load build context 0.0s=> => transferring context: 98B 0.0s=> CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 0.0s=> CACHED [3/3] COPY hm-service.jar /app.jar 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71 0.0s=> => naming to docker.io/library/root-hmall 0.0s
[+] Running 4/4✔ Network hmall Created 0.2s✔ Container mysql Started 0.5s✔ Container hmall Started 0.9s✔ Container nginx Started 1.5s# 6.查看镜像
docker compose images
# 结果
CONTAINER REPOSITORY TAG IMAGE ID SIZE
hmall root-hmall latest 32eebee16acd 362MB
mysql mysql latest 3218b38490ce 516MB
nginx nginx latest 605c77e624dd 141MB# 7.查看容器
docker compose ps
# 结果
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
hmall root-hmall "java -jar /app.jar" hmall 54 seconds ago Up 52 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql mysql "docker-entrypoint.s…" mysql 54 seconds ago Up 53 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx nginx "/docker-entrypoint.…" nginx 54 seconds ago Up 52 seconds 80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp