Docker
一、概述
docker容器的背景及优点不做赘述
docker为go语言开发的一种容器技术,主要用于解决项目"水土"不服问题
二、安装docker
在linux系统中使用yum安装
-
将yum更新到最新
yum update
-
安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
-
设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
安装docker
yum install -y docker-ce
-
查看docker版本,检验是否成功
docker -v
三、命令
-
服务相关命令
-
启动docker服务
systemctl start docker
-
停止docker服务
systemctl stop docker
-
重启docker服务
systemctl restart docker
-
查看docker服务状态
systemctl status docker
-
开机启动docker服务
systemctl enable docker
-
-
镜像相关命令
-
查看镜像
docker images
-
搜索镜像
docker search 镜像名称
-
拉取镜像
docker pull 镜像名称:版本号
-
删除镜像
docker rmi 镜像名称:版本号
-
-
容器相关命令
-
查看容器
docker ps # 查看正在运行的容器
daocker ps -a #查看所有容器
-
创建容器
docker run -it --name=centos centos:latest /bin/bash
- -i:保持容器运行
- -t:为容器重新分配一个伪输入终端
- -d:以守护进程模式运行容器,退出后容器不会停止
- -it:创建一个交互式容器,推出后容器容器停止运行
- -id:创建一个守护容器;退出后容器不停止运行
- –name:为创建的容器命名
-
进入容器
docker exec -it 容器名称 /bin/bash
-
启动容器
docker start 容器名称
-
停止容器
docker stop 容器名称
-
删除容器
docker rm 容器名称
docker rm `docker ps -aq` #产出所有容器
-
产看容器信息
docker inspect 容器名称
-
四、数据卷
1.数据据卷是什么?
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据目录绑定后对方的修改会同步(双向同步)
- 一个数据卷可以被多个容器同时挂载
- 一个容器可以被挂载多个数据卷
2.数据卷作用:
- 容器数据持久化
- 外部机器和容器**间接**通信
- 容器间数据交换
3.配置数据卷
创建、启动容器时,使用-v参数设置数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件)
注:
- 目录必须是绝对路径
- 如果目录不存在,会自动创建
- 可以挂载多个数据卷
数据卷容器
数据卷容器可以时多个容器间进行数据操作
原理:多个容器挂载到同一个数据卷容器上,数据卷再挂载到一个数据卷,即可实现
-
创建数据卷容器
docker run -it --name=c3 -v /volume centos:latest
-
创建普通容器
docker run -it --name=c1 --volumes-from c3 centos:latest docker run -it --name=c2 --volumes-from c3 centos:latest
五、应用部署
Mysql:
-
搜索mysql镜像
docker search mysql
-
拉拉取MySQL镜像
docker pull mysql:5.6
-
创建容器
#在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysql
docker run -id \ -p 3307:3306 \ --name=n_mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.6
参数说明:
- -p 3307:3306:将容器的3306端口映射到宿主机的3307端口
- -v $PWD/conf:/etc/mysql/conf.d :将主机当前目录下的conf目录(数据卷)挂载到mysql/conf配置目录下
- $PWD/logs:/logs:同上,挂载日志
- v $PWD/data:/var/lib/mysql:同上挂载数据
- e MYSQL_ROOT_PAWSSWORD=123456:设置root用户的密码
-
操作docker容器
*使用远程连接docker数据库时,ip为宿主机ip;端口为docker容器绑定的宿主机开放端口;密码为设置的密码
tomcat:
-
搜索
docker search tomcat
-
拉取
docker pull tomcat
-
创建容器,设置端口映射、目录映射
#在/root目录下创建tomcat目录用于存储tomcat数据信息 mkdir ~/tomcat cd ~/tomcat
docker run -id --name=n_tomcat \ -p 8080:8080 \ -v $PWD:/usr/local/tomcat/webapps \ tomcat
tips1:本人在创建时未拉取的镜像,容器会自动拉取对应的镜像
tips2:在访问时会出现404,原因为:webapps下为空,所以无法访问;在镜像的tomcat目录下有两个目录:webapps.dist和webapps,删除webapps(如果由挂载数据卷将无法删除)并将dist改为webapps即可访问
六、dockerfile
docker镜像概念:本质为叠加的文件系统
Docker容器转为镜像:
-
docker commit 容器id 自定义镜像名称:自定义版本号
将镜像转为文件:
-
docker save -o 压缩文件名称 镜像名称
将镜像压缩文件转为镜像:
-
docker load -i 压缩文件名称
注:在将容器转化为镜像后,再还原为容器将不包含原挂载的数据卷中的数据,而放置在容器中的数据则还在
Dockerfile概念:
dockerfile是一个文本文件,包含了一些指令集;每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。
dockerfile创建案例:
-
案例一
需求:
- 默认登录路径为/usr
- 可以使用vim
dockerfile实现:
- 定义父镜像:FROM centos:latest
- 定义作者信息:MAINTAINER zjj_centos
- 执行安装vim命令:RUN yum install -y vim
- 定义默认的工作路径:WORKDIR /usr
- 定义容器启动执行的命令:CMD /bin/bash
dockerfile文件创建完成后使用命令,即可安装镜像:
docker build -f dockerfike文件名 -t 自定义镜像名:自定义版本号 .
使用该镜像创建容器即可达到目标效果:
-
案例二
需求:
定义dockerfile,发布springboot项目
dockerfile实现:
-
定义父镜像,springboot需要java环境:
FROM java:8
-
作者信息:
MAINTAINER j_springboot_docker
-
添加springboot项目并更改名字(这里项目与dockerfile文件在同一目录):
ADD springboot01-1.0-SNAPSHOT.jar app.jar
-
命令(运行springboot项目)
CMD java -jar app.jar
tips:没有指定的父镜像,将会自动下载
dockerfile文件创建完成后使用命令,即可安装镜像:
docker run -id -p 8000:8080 springboot
tips:创建容器时需要将springboot内嵌tomcat8080端口映射到宿主机的端口;此外:本人在操作时发现无法访问该项目,经排查发现是因为我在springboot项目中的application.yml文件中指定端口为8000,所以不能使将宿主机端口映射到8080,而是映射到8000
-
七、服务编排
八、私有仓库
-
搭建私有仓库
-
拉取私有仓库镜像
docker pull registry
-
启动私有仓库
docker run -id --name=registry -p 5000:5000 registry
-
浏览器访问:http://私有仓库ip:5000/v2/_catalog,可有看到所具有的镜像
-
修改daemon.json
vim /etc/docker/daemon.json #添加 ["私有仓库ip:5000"]
-
重启docker服务
systemctl restart docker docker start registry
-
-
将镜像上传至私有仓库
-
标记镜像为私有仓库镜像
docker tag centos:latest 私有仓库ip:5000/centos:latest
-
上传标记的镜像
docker push 私有仓库ip:5000/centos:latest
-
-
从私有仓库拉取镜像
docker pull 私有仓库ip:5000/镜像名称:版本号