目录
一、docker简介
-
Docker 是一个开源的应用容器引擎,基于GO语言并遵从 Apache2.0 协议开源。
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
相关链接
docker官网:http://www.docker.com
Docker Hub官网: https://hub.docker.com/
二、docker架构
Docker 包括三个基本概念:
- 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
三、docker安装
CentOS7安装Docker
1.yum安装gcc相关
yum -y install gcc
yum -y install gcc-c++
2.安装需要的软件包
yum install -y yum-utils
3.设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装DOCKER CE
yum -y install docker-ce docker-ce-cli containerd.io
6.启动docker
systemctl start docker
7.阿里云镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://*********.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
8.测试
docker version
docker run hello-world
9.卸载
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
四、docker常用命令
1.帮助启动类命令
启动docker: systemctl start docker
停止docker: systemctl stop docker
重启docker: systemctl restart docker
查看docker状态: systemctl status docker
开机启动: systemctl enable docker
查看docker概要信息: docker info
查看docker总体帮助文档: docker --help
查看docker命令帮助文档: docker 具体命令 --help
2.镜像命令
列出本地主机上的镜像 docker images
搜索远程仓库中的镜像 docker search 某个XXX镜像名字
下载镜像 docker pull 某个XXX镜像名字
查看镜像/容器/数据卷所占的空间 docker system df
删除镜像 docker rmi 某个XXX镜像名字ID
3.容器命令
有镜像才能创建容器,这是根本前提
新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
–name=“容器新名字” 为容器指定一个名称;
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);-i:以交互模式运行容器,通常与 -t 同时使用;
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
也即启动交互式容器(前台有伪终端,等待交互);-P: 随机端口映射,大写P
-p: 指定端口映射,小写p
官方参考:https://docs.docker.com/engine/reference/commandline/run/
列出当前所有正在运行的容器
docker ps [OPTIONS]
OPTIONS说明(常用):
-a :列出当前所有正在运行的容器+历史上运行过的
-l :显示最近创建的容器。
-n:显示最近n个创建的容器。
-q :静默模式,只显示容器编号。
退出容器
- run进去容器,exit退出,容器停止
exit
- run进去容器,ctrl+p+q退出,容器不停止
ctrl+p+q
启动已停止运行的容器
docker start 容器ID或者容器名
重启容器
docker restart 容器ID或者容器名
停止容器
docker stop 容器ID或者容器名
强制停止容器
docker kill 容器ID或容器名
删除已停止的容器
docker rm 容器ID
查看容器日志
docker logs 容器ID
查看容器内运行的进程
docker top 容器ID
查看容器内部细节
docker inspect 容器ID
进入正在运行的容器并以命令行交互
docker exec -it 容器ID bash
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
导入和导出容器
docker export 容器ID > 文件名.tar
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
五、docker镜像
UnionFS(联合文件系统):Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
Docker镜像commit操作
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
原始的默认Ubuntu镜像是不带着vim命令的,外网连通的情况下,安装vim
apt-get update
apt-get -y install vim
安装完成后,commit我们自己的新镜像
例如:docker commit -m="ifconfig cmd add" -a="zzyy" a69d7c825c4f zzyyubuntu:1.2
六、docker容器
Docker容器数据卷
将docker容器内的数据保存进宿主机的磁盘中,这样在docker容器销毁后,里面的数据也不会丢失。
1.宿主vs容器之间映射添加容器卷
命令:docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
查看数据卷是否挂载成功:docker inspect 容器ID
容器和宿主机之间数据共享:docker修改,主机同步获得 ;主机修改,docker同步获得。
2.卷的继承和共享
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
七、docker仓库
本地镜像发布到私有库流程
1.下载镜像Docker Registry
docker pull registry
2.运行私有库Registry,相当于本地有个私有Docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
3.curl验证私服库上有什么镜像
curl -XGET http://192.168.111.162:5000/v2/_catalog
请使用自己的ip地址
4.将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
5.修改配置文件使之支持http
vim命令新增如下红色内容:vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://*******.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.111.162:5000"]
}
6.push推送到私服库
docker push 192.168.111.162:5000/zzyyubuntu:1.2
7.curl验证私服库上有什么镜像2
curl -XGET http://192.168.111.162:5000/v2/_catalog
8.pull到本地并运行
docker pull 192.168.111.162:5000/zzyyubuntu:1.2
八、Dockerfile
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本。
官方参考:https://docs.docker.com/engine/reference/builder/
自定义镜像mycentosjava8
FROM centos
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
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
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
docker build -t 新镜像名字:TAG .
docker build -t centosjava8:1.5 .
注意,上面TAG后面有个空格,有个点
docker run -it 新镜像名字:TAG
docker run -it centosjava8:1.5 /bin/bash
九、微服务案例
1.IDEA工具里面搞定微服务jar包
2.编写Dockerfile
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER zzyy
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为zzyy_docker.jar
ADD docker_boot-0.0.1-SNAPSHOT.jar zzyy_docker.jar
# 运行jar包
# 这个命令不执行也行
RUN bash -c 'touch /zzyy_docker.jar'
ENTRYPOINT ["java","-jar","/zzyy_docker.jar"]
#暴露6001端口作为微服务
EXPOSE 6001
3.构建镜像
docker build -t zzyy_docker:1.6 .
4.运行容器
docker run -d -p 6001:6001 zzyy_docker:1.6
5.访问测试
http://192.168.111.163:6001/order/docker
十、Docker网络
查看网络: docker network ls
删除网络: docker network rm XXX网络名字
- bridge模式:使用–network bridge指定,默认使用docker0
- host模式:使用–network host指定
- none模式:使用–network none指定
- container模式:使用–network container:NAME或者容器ID指定
自定义网络
自定义桥接网络,自定义网络默认使用的是桥接网络bridge
1.新建网络
docker network create -d bridge test-net
2.新建容器加入上一步新建的自定义网络
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8
3.互相ping测试
ping tomcat81
ping tomcat82
自定义网络本身就维护好了主机名和ip的对应关系(ip和域名都能通)
十一、总结
本文仅对docker常用命令和概念做简要介绍。docker是一个非常庞大的生态系统,还有很多内容。例如:Docker-compose容器编排、Docker轻量级可视化工具Portainer、Swarm集群、Docker容器监控之CAdvisor+InfluxDB+Granfana。