【Docker】学习docker
1.Docker安装与启动
1.1.安装
- 【第一步】yum包更新到最新版本
sudo yum update
- 【第二步】安装需要的软件包,yum-util提供的yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 【第三步】设置yum源为阿里云
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 【第四步】安装docker
- 注意:docker有两个版本:社区版(docker-ce)免费,企业版(docker-ee)收费
sudo yum install docker-ce
1.2.设置ustc的镜像
ustc是老牌的linux镜像服务提供者,加速docker镜像下载,不需要注册,是真正的公共服务。
- 【第一步】编辑daemon.json文件
# 编辑模式打开该文件:
vi /etc/docker/daemon.json
# 在文件中输入如下内容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
1.3.Docker的启动与停止
- 【步骤一】使用systemctl命令操作docker的启动停止
#1.启动docker
systemctl start docker
#2.停止docker
systemctl stop docker
#3.重启docker
systemctl restart docker
#4.查看docker状态
systemctl status docker
#5.设置开机自启docker
systemstl enable docker
###6.查看docker的概要信息###
docker info
###7.查看docker的帮助文档###
docker --help
2.Docker常用命令
2.1.镜像相关命令
- 【命令一】查看镜像
#查看镜像
docker images
注释:(镜像存储位置:Docker宿主机的var/lib/docker目录下)
REPOSITORY | TAG | IMAGE ID | CREATED | SIZE |
---|---|---|---|---|
镜像名称 | 镜像标签 | 镜像ID | 镜像的创建日期(非我们拉取下载的日期) | 镜像大小 |
- 【命令二】搜索镜像
#如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
docker search 镜像名称
注释:
NAME | DESCRIPTION | STARS | OFFICIAL | AUTOMATED |
---|---|---|---|---|
镜像名称 | 镜像描述 | 用户评价 | 是否官方 | 自动构建,表示该镜像由Docker Hub自动构建流程创建的 |
- 【命令三】拉取镜像
#1.拉取镜像:从中央仓库中下载镜像到本地
docker pull 镜像名称
#2.若未设置拉取镜像的版本,默认拉取最新的版本,如下设置拉取镜像的版本
# 冒号后跟版本号
docker pull centos:7
- 【命令四】删除镜像
#1.按镜像ID删除镜像
docker rmi 镜像ID
#2.删除所有镜像
docker rmi `docker images -q`
2.2.容器相关命令
- 【命令一】查看容器
#1.查看正在运行的容器
docker ps
#2.查看所有容器
docker ps -a
#3.查看最后一次运行的容器
docker ps -l
#4.查看停止的容器
docker ps -f status=exited
- 【命令二】创建与启动容器
#1.创建容器的基础命令
docker run
#1.1.携带参数说明:
-i #表示运行此容器
-t #表示容器启动后会进入其命令行,加入这两个参数后,容器以可登录进去的方式创建一个伪终端。
--name #创建的当前容器的名字
-v #表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d #在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i-t两个参数,创建后就会自动进入容器)。
-p #表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射。
#2.创建容器的两种方式
#2.1.交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
#此时已经进入创建好的容器中了,并且可以使用ps命令查看启动的容器状态
#此时退出容器使用命令
exit
#2.2.守护式方式创建容器
docker run -di --name=容器名称 镜像名称:标签
#标签:就是容器的tag
#登录守护式容器方式
docker exec -it 容器名称(或者容器ID) /bin/bash
#3.创建容器-设置服务器重启、docker服务重启、docker创建的当前镜像也会自动启动
docker run -di --name=容器名称 --restart=always 镜像名称:标签
#3.1.给已经创建的容器设置自启
docker update --name=容器名称 --restart=always
#注意结论:
#一、以交互式方式创建的容器,退出容器后,容器自动关机
#二、以守护方式创建的容器,不直接进入容器,默认后台运行容器,可以使用命令登录容器,退出容器,容器依然正常运行。
- 【命令三】停止与启动容器
#1.停止容器
docker stop 容器名称(或者容器ID)
#2.启动容器
docker start 容器名称(或者容器ID)
- 【命令四】文件拷贝
#1.将文件拷贝到容器内可以使用cp命令
docker cp 需要拷贝的文件或目录 容器名称(或者容器ID):容器目录
#2.将文件从容器内拷贝出来
docker cp 容器名称(或者容器ID):容器目录 需要拷贝的文件或目录
- 【命令五】目录挂载
目录映射:我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。
#1.创建容器添加-v参数的后面为: (宿主机目录:容器目录),如下:
docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=myTomcat tomcat:8
#注意:如果你共享的是多级的目录,可能会出现权限不足的提示
#这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加如下参数,来解决挂载的目录没有权限的问题。
--privileged=true
- 【命令六】查看容器的IP地址
#1.通过如下命令查看容器运行的各种数据
docker inspect 容器名称(或者容器ID)
#2.直接输出IP的命令
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
- 【命令七】删除容器
#1.删除指定容器
docker rm 容器名称(或者容器ID)
#2.强制删除正在运行中的容器
docker rm -f 容器名称(或者容器ID)
- 【命令八】进入容器内部操作
#1.进入正在运行的指定容器
docker exec -it 容器名称(或者容器ID) /bin/bash
docker exec -it 容器名称(或者容器ID) /bin/sh
#2.退出容器
exit
3.Docker的应用部署
3.1.MySql部署
#1.拉取mysql镜像
docker pull centos/mysql-57-centos7
#2.创建容器
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
#注释: -p代表端口映射,格式为: (宿主机映射端口:容器运行端口)
# -e代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登录密码
#3.进入mysql容器
docker exec -it tensquare_mysql /bin/bash
#4.登录mysql
mysql -u root -p
#5.远程登录mysql
#连接宿主机的IP,指定端口为33306
3.2.Tomcat部署
#1.拉取镜像
docker pull tomcat:7-jre7
#2.创建容器 (-p表示地址映射)
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
#注意:映射完路径的webapps文件夹会被清空,需要再宿主机上部署自己的war包到webapps目录下
#使用sftp上传包的命令:(单个文件上传命令)
sftp> put d:\目录1\dgc.war
#使用sftp上传一个目录的命令:
sftp> put -r d:\目录1\需要上传目录
3.3.Nginx部署
#1.拉取镜像
docker pull nginx
#2.创建Nginx容器
docker run -di --name=dgcNginx -p 81:80 nginx
#3.进入Nginx容器
docker exec -it dgcNginx /bin/bash
#3.1.修改nginx的index.html页面
echo "<h1>Welcome to Nginx Dogulas</h1>" > index.html
#部署前端vue项目到容器内步骤:
#1.将需要部署的项目包 改名为 html: mv 需要部署的项目文件 html
#2.拷贝到nginx的目录下覆盖原有的html目录: docker cp html dgcNginx:/usr/share/nginx
#注意:docker安装的nginx地址在:/etc/nginx,但是项目部署访问映射的地址可以通过nginx.conf看到,一般在:/usr/share/nginx
3.4.Redis部署
#1.拉取镜像
docker pull redis
#2.创建容器(默认创建方式)
docker run -di --name=dgcRedis -p 6379:6379 redis:latest
#3.挂载宿主机配置文件和数据文件地址-且启动加载自定义配置文件
docker run -di --name=myRedis -p 6379:6379 -v /opt/dockerTool/redis/redis.config:/etc/redis/redis.config -v /opt/dockerTool/redis/data:/data (镜像名称:版本号)redis:latest (加载自定义配置)redis-server /etc/redis/redis.config
#使用命令远程连接redis服务:本地得有redis-cli安装包
#执行连接命令:redis-cli -h 150.158.7.35
4.Docker的迁移与备份
4.1.容器保存为镜像
#1.将已有的容器保存为镜像
docker commit dgcNginx dgcnginx_1
docker commit -a "作者" -m "改变说明" 容器名称(容器ID) 自定义镜像名称(目标镜像名称必须全部为小写)例如:dgcnginx:v1.0.0
4.2.镜像备份
#1.通过如下命令可以将镜像保存为tar文件
docker save -o dgcNginx.tar dgcNginx_1
docker save -o 输出的文件名称 镜像名称
4.3.镜像恢复与迁移
#1.恢复前当前宿主机不能存在当前需要恢复的镜像,可以先删除dgcnginx_1镜像,使用如下命令导入备份的镜像,进行恢复:
docker load -i dgcNginx.tar
#注意:-i 输入的文件,执行完毕可以再次查看镜像,已经恢复
#注意删除镜像的顺序:
#1.1.停止当前运行的该容器
docker stop dgcNginx2
#1.2.删除当前镜像的相关容器
docker rm dgcNginx2
#1.3.删除镜像
docker rmi dgcnginx_i:latest
4.4.镜像推送Docker官网仓库
#1.需要在docker官网注册自己的账号
#2.需要在自己账号下创建自己的仓库
#3.先将镜像打上推送标签
docker tag 现需要推送的镜像名称:版本 你的docker官网镜像仓库地址:版本(douglas1314/mynginx:v1.0)
#4.在需要推送镜像的服务器上登录docker
docker login
#5.推送打好标签的镜像
docker push 你的docker官网镜像仓库地址版本(douglas1314/mynginx:v1.0)
#6.推送完镜像后退出
docker logout
#7.其它人可以通过命令拉取
docker pull douglas1314/mynginx:v1.0
5.Dockerfile
5.1.什么事dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。
- 优点1、对于开发人员:可以为开发团队提供一个完全一致的开发环境。
- 优点2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作。
- 优点3、对于运维人员:在部署时,可以实现应用的无缝移植。
5.2.常用命令
命令 | 作用 |
---|---|
FROM image_name.tag | 定义了使用那个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量,(可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条) |
ADD source_dir/filedest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/filedest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
5.3.案例:使用Dockerfile构建jdk1.8镜像
#1.在宿主机上创建一个目录,如下:
mkdir -p /usr/local/dockerjdk8
#2.上传本地jdk8的安装包到dockerjdk8目录下
#3.在dockerjdk8目录下创建一个文件:Dockerfile
#4.编写Dockerfile文件脚本,内容如下:
FROM centos:7
MAINTAINER dgc #表示:创建镜像的创建者
WORKDIR /usr #表示:设置当前目录
RUN mkdir /usr/loacl/java #表示:创建一个java目录
ADD jdk-8u144-linux-x64.tar.gz /usr/local/java #表示:添加需要制作镜像的压缩包到虚拟机目录下且解压
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144 #表示:配置环境变量第一步
ENV JRE_HOME $JAVA_HOME/jre #表示:配置环境变量第二步
ENV CLASSPATH $JAVA_HOME/bin/dt.jar;$JAVA_HOME/lib/tools.jar;$JRE_HOME/lib;$CLASSPATH
ENV PATH $JAVA_HOME/bin;$PATH
#5.使用docker命令构建jdk1.8镜像
docker build -t='jdk1.8' . #表示: jdk1.8(镜像名称),点.:当前目录寻找Dockerfile脚本文件
#6.构建完成镜像,可以使用docker images查看自己构建的镜像
6.Docker私有仓库
6.1.私有仓库搭建与配置
#1.拉取私有仓库镜像(docker的私有仓库也是一个镜像,直接拉取构建容器启动即可)
docker pull registry
#2.启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
#3.通过浏览器访问如下地址,可以看到{"repositories":[]}表示私有仓库搭建成功并且为空
http://宿主机IP:5000/v2/_catalog
#4.修改daemon.json(文件地址在:/etc/docker/daemon.json)
vi /etc/docker/daemon.json
#4.1.添加如下内容:(配置:让docker信任这个私有仓库地址)
{"insecure-registries":["宿主机IP:5000"]}
#5.重启docker服务让配置生效
systemctl restart docker
6.2.镜像上传至私有仓库
#1.标记此镜像为私有仓库的镜像(打标签)
docker tag jdk1.8 宿主机IP:5000/jdk1.8
#2.上传标记的镜像
docker push 宿主机IP:5000/jdk1.8
6.3.拉取私有仓库镜像
#1.不同服务器拉取私有仓库镜像,第一步:服务器续安装docker
#2.修改daemon.json(文件地址在:/etc/docker/daemon.json)
vi /etc/docker/daemon.json
#2.1.添加如下内容:(配置:让docker信任这个私有仓库地址)
{"insecure-registries":["宿主机IP:5000"]}
#3.拉取私有仓库镜像
docker pull 私有仓库地址IP:5000/镜像名称
7.补充常用命令
#1.日志查看
docker logs 容器名称(容器ID)
#2.进入容器内部
docker exec -it 容器ID /bin/bash
#3.映射经常需要修改的文件(ro-代表只读,rw-读写)
docker run -d --name=nginx -p 80:80 -v 宿主机目录(/data/html):容器目录(/usr/share/html):ro -v 宿主机目录(/data/conf/nginx.config):容器目录(/usr/nginx/nginx.conf):rw 容器名称(容器ID)
#4.把容器指定目录东西复制到宿主机指定目录
docker cp 容器名称(容器ID):容器文件目录(/etc/nginx/nginx.config) 宿主机文件目录(/data/config/nginx.config)
#5.把宿主机的文件复制到容器目录中
docker cp 宿主机文件目录(/data/config/nginx.config) 容器名称(容器ID):容器文件目录(/etc/nginx/nginx.config)
8.Java的jar服务部署docker运行
#1.使用idea打好jar包
#2.项目根目录下创建Dockerfile文件
#3.编辑Dockerfile脚本文件内容如下:
#3.1.docker官网的jdk镜像
FROM openjdk:8-jdk-slim
#3.2.作者名称
LABEL maintainer=douglas
#3.3.将target文件夹中的jar包 拷贝到镜像根目录下命名为app.jar
COPY target/*.jar /app.jar
#3.4.启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
#4.将target文件夹只含jar包拷贝到临时文件夹,再将Dockerfile文件拷贝到临时目录同级target目录
#5.上传临时包至docker存在服务器上(目录自定义)
#6.在临时目录下-执行docker构建镜像命令
docker build -t 自定义镜像名称:版本(myjava-demo:v1.0) (标识点当前目录).
#7.镜像构建完毕后创建容器
docker run -d --name=myjava-demo -p 8080:8080 镜像名称(镜像ID)myjava-demo:v1.0