Docker学习
1、什么是Docker
docker是一种应用容器技术,是系统层面上的虚拟化。docker容器使用了沙箱机制,所以docker容器之间不会相互影响,各自独立运行着。
2、Docker的作用
既然docker是一个容器,那它就是用来装东西的,可以装什么东西呢?各种应用程序,例如:tomcat、mysql、redis等。从下面这张图片可以知道,鲸鱼就好比是一个个系统,鲸鱼背上的集装箱是一个个docker容器,我们使用的应用程序则装在集装箱里面。以前我们把项目从Window部署到Linux上时,需要在Linux上配置与Window上相同的环境,才得以将项目运行起来,而且可能由于环境的不同,导致出现项目运行不起来的情况。docker的出现,则把这个问题给解决了,就是把运行环境给打包到一个个容器里,则实现了“一次封装,处处运行”的效果。无论把项目部署到哪里,我们只要把容器运行起来,就可以把项目给运行起来,无需把关注点放到配置环境上。
3、Docker三要素
- 仓库:用于存放镜像文件,即可建立本地仓库,也可以通过远程仓库把镜像文件拉取到系统中使用。
- 镜像:是一个模板,一个类,是静态的。通过镜像可以创建一个个的容器。
- 容器:是一个对象,是动态的。由镜像创建出来,我们可以将应用程序部署到容器上面。容器之间互相隔离,互不影响。
4、阿里云镜像加速器配置
- 获取镜像加速器地址:dev.aliyun.com
-
进入管理控制器--->找到镜像加速器--->进入系统进行配置
- 复制加速器地址,写入到如下文件中。
vim /etc/docker/daemon.json
5、常用命令
5.1、镜像命令(增删改查)
5.1.1 查看镜像
docker images
5.1.2 从远程仓库中搜索镜像
docker search 镜像名
eg:docker search nginx
5.1.3 拉取镜像到本地系统
docker pull 镜像名
eg:docker pull nginx #不指定版本号,则拉取最新版本
5.1.4 删除镜像
docker rmi 镜像ID
eg:docker rmi 992e3b7be046
# 删除所有镜像(慎用)
docker rmi `docker images -q`
5.2 容器命令(增删改查)
5.2.1 查看容器
# 查看正在运行的容器
docker ps
# 查看所有容器
docker ps -a
# 查看最有一次运行的容器
docker ps -l
# 查看停止的容器
docker ps -f status=exited
5.2.2 创建与启动容器
① 创建容器常用参数说明
- docker run
1 -i:表示运行容器 2 3 -t:表示启动容器时,进入命令行模式 4 5 --name:指定容器的名字 6 7 -v:表示与宿主机的目录进行映射(前者为宿主机目录,后者为容器目录)。宿主机目录内容,会同步到容器目录中 8 9 -d:表示为以后台式运行容器 10 11 -p:表示端口映射(前者是宿主机端口,后者为容器端口)
② 交互式方式创建容器
- (前台容器)启动容器的同时,进入该容器命令行。当使用exit退出容器时,则该容器也会被停止,但是还没有被删除。
1 docker run -it --name=容器名称 镜像名称:标签 /bin/bash 2 3 # 比如:docker run -it --name=mycentos centos:7 /bin/bash 4 5 # docker run:表示创建容器 6 7 # -it:表示运行容器并进入它的命令行 8 9 # --name=mycentos:给当前的容器命名 10 11 # centos:7:使用该镜像创建 12 13 # /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
③ 创建守护式容器(后台容器)
docker run -id --name=容器名 镜像名:版本号 eg:docker run -id --name=mycentos5 centos:7
# 进入守护式容器 docker exec -it 容器名称 (或者容器ID) /bin/bash eg:docker exec -it mycentos5 /bin/bash
5.2.3 停止与启动容器
停止容器
docker stop 容器名称(或者容器ID)
eg:docker stop mycentos5
启动容器
docker start 容器名称(或者容器ID)
eg:docker start mycentos5
5.2.4 文件拷贝
- 文件拷贝:即将宿主机上的文件拷贝到容器上。
docker cp 需要拷贝的文件或目录 容器名称:容器目录 例如: docker cp anaconda-ks.cfg mycentos5:/tmp
- 从容器中,拷贝文件到宿主机中(注意:需要在宿主机)。
docker cp 容器名称:容器目录 需要拷贝的文件或目录 eg:docker cp mycentos5:/tmp/anaconda-ks.cfg ./
5.2.5 目录挂载
- 目录挂载:使宿主机与容器的目录进行映射关系,一方的改变则会影响另一方。在创建新容器时,进行目录挂载。
# -v参数 后边为 宿主机目录:容器目录 docker run -di --name=容器的名字 -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos6 centos:7 比如:docker run -di --name=mycentos6 -v /tmp/myhtml:/tmp/myhtml centos:7
5.2.6 查看容器IP地址
docker inspect 容器名称(容器ID)
# 在linux宿主机下查看 mycentos6 的ip
- 指定信息进行查询
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID) # 例如:docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos6
5.2.7 删除容器
- 删除指定容器(前提:停止运行的容器)。删除容器后,即可以删除镜像。
docker rm 容器名称(容器ID) 例如:docker rm mycentos1
6、用docker进行应用部署
6.1 MySQL部署
6.1.1 从远程仓库中,拉取mysql镜像
docker pull mysql
6.1.2 创建mysql容器
# 创建mysql5.7容器 # docker run -di --name=容器名字 -p 宿主机端口:容器端口 -e MYSQL_ROOT_PASSWORD=mysql密码 容器名称 docker run -di --name=mysql5.7 -p 9999:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
6.1.3 连接数据库
7、容器的迁移与备份
7.1 将容器保存为镜像
# 保存nginx容器为镜像
docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i
7.2 镜像备份
# 命令形式:docker save –o tar文件名 镜像名 # 保存镜像为文件 -o:表示output 输出的意思 docker save -o mysql.tar mysql-01
7.3 进行恢复与迁移
- 镜像恢复
# 命令形式:docker load -i tar文件名 docker load -i mysql.tar
- 需要迁移时,则直接将tar文件移到到其他宿主机即可,然后进行镜像恢复即可。
8、Dockerfile
8.1 什么是Dockerfile
我们上面使用的镜像都是官方或其他人提供的,当我们需要创建直接的镜像文件时,则需要创建Dockerfile,来进行配置,通过该文件,则可以生成对应的镜像(定制镜像)。Dockerfile是由一条条指令和说明所构成的。
8.2 Dockerfile常用指令
8.3 使用Dockerfile创建镜像
8.3.1 创建目录
mkdir –p /usr/local/dockerjdk8
8.3.2 定制镜像
1. 使用ftp工具连接宿主机,上传文件
2. 将该文件移动到刚刚创建的目录下
mv jdk-8u144-linux-x64.tar.gz /usr/local/dockerjdk8
3. 创建Dockerfile文件
# Dockerfile 名字不要改 vim Dockerfile
# 写入以下内容
#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER BaiYun
#切换工作目录
WORKDIR /usr
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
4. 执行命令,构建镜像
docker build -t='jdk1.8' .
8.3.3 查看定制镜像是否构建成功
9、搭建私有仓库
9.1 什么是私有仓库
私有仓库:仓库即是存放多个镜像的地方,私有表示为只能在内网中使用。Docker hub(https://hub.docker.com)则是对外网提供服务的,当我们没有联网时,则需要在私有仓库里拉取镜像下来。
9.2 私有仓库的搭建和配置
1. 拉取私有仓库镜像
docker pull registry
2. 启动私有仓库容器
docker run -di --name=registry-01 -p 5000:5000 registry
3. 浏览器打开http://192.168.43.129:5000/v2/_catalog
4. 修改daemon.json
vim /etc/docker/daemon.json
# 添加以下内容
"insecure-registries":["192.168.43.129:5000"]
5. 重启docker
systemctl restart docker
9.3 上传镜像到私有仓库
1. 标记此镜像为私有仓库的镜像
# docker tag jdk1.8 宿主机IP:5000/jdk1.8 docker tag jdk1.8 192.168.43.129:5000/jdk1.8
2. 再次启动私有仓库
docker start registry
3. 上传镜像
# docker push 宿主机IP:5000/jdk1.8 docker push 192.168.43.129:5000/jdk1.8
4. 刷新http://192.168.43.129:5000/v2/_catalog
10、从私有仓库拉取镜像
- 从私有仓库中拉取镜像
docker pull 192.168.43.129:5000/tomcat-01
- 列出私有仓库中的所有镜像
curl http://192.168.43.129:5000/v2/_catalog
- 列出tomcat-01镜像有哪些tag
curl http://192.168.43.129:5000/v2/tomcat-01/tags/list