Docker安装及使用
docker安装
- 版本:
Docker19.03
Centos7.8
-
配置docker国内源:阿里云
参考:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.140b1b11bwX1kc
-
配置epel源:阿里云
参考:https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.4ee91b11009TvV
安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2 #安装一些系统工具
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #添加阿里云镜像地址
yum makecache fast #更新yum缓存
yum -y install docker-ce docker-ce-cli containerd.io #安装docker-ce版
systemctl start docker #启动docker
systemctl enable docker #开机自启
-
配置阿里云镜像加速
修改daemon配置文件/etc/docker/daemon.json来使用加速器
mkdir/etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://f3z6wzas.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker卸载
$ sudo yum remove docker-ce docker-ce-cli containerd.io
$ sudo rm -rf /var/lib/docker
docker使用
docker架构图
帮助命令
docker version #docker版本信息
docker info #docker详细信息
常用镜像命令
docker images #列出本地所有镜像
[aaa@qq.com ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
own_tomcat 1.0 fdef511b25ad 25 hours ago 652MB
tomcat latest 2eb5a120304e 47 hours ago 647MB
nginx latest 2622e6cca7eb 2 days ago 132MB
mysql latest be0dbf01a0f3 3 days ago 541MB
centos latest 470671670cac 4 months ago 237MB
#解释
REPOSITORY #镜像仓库
TAG #镜像标签
IMAGE ID #镜像ID(唯一)
CREATED #镜像创建时间
SIZE #镜像大小
#命令参数可选项
-a, --list #列出所有镜像
-q, --quiet #只显示镜像ID
docker search #镜像搜索
[aaa@qq.com ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 9616 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3494 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 702 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 76
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 69
centurylink/mysql Image containing mysql. Optimized to be link… 61 [OK]
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
bitnami/mysql Bitnami MySQL Docker Image 39 [OK]
#命令参数可选项
--filter=STARS=9000 #过滤STARS大于9000的镜像
docker pull #下载镜像
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST] #不指定TAG默认下载最新版本
#例:
docker pull mysql #下载mysql最新版本
docker pull mysql:5.7 #下载mysql5.7版本
docker rmi #删除镜像
docker rmi -f 镜像ID #删除指定镜像
docker rmi -f 镜像ID 镜像ID 镜像ID #删除多个镜像
docker rmi $(docker images -qa) #删除全部镜像 等价于
docker images -qa | xargs docker rmi
常用容器命令
docker run
docker run [可选参数] image名称
#可选参数,注意防火墙端口放行,注意selinux
--name="name" #指定容器名字
-d #容器后台运行
#单独启动一个系统,没有启动应用或进程会自动停止,docker ps不会显示
-it #使用交互运行方式,进入容器
-p #指定容器端口
-p 主机IP:主机端口:容器端口
-p 主机端口:容器端口 #常用
-p 容器端口
-P #随机使用端口
#进入容器
exit #退出容器并停止运行
Ctrl+p+q #退出容器不停止运行
docker ps
docker ps #列出正在运行的容器
#可选参数
-a #列出所有容器(正在运行的和已停止的容器)
-n=(数字) #显示最近创建的容器
-q #只显示容器编号
docker rm
docker rm 容器ID
docker rm $(docker ps -qa) #删除全部容器,不能产出正在运行的容器
等价于
docker ps -qa | xargs docker rm
容器启动与停止
docker start 容器ID #启动容器
docker stop 容器ID #停止容器
docker restart 容器ID #重启容器
docker kill 容器ID #强制停止容器
其他常用命令
docker logs [可选参数] 容器ID #查看容器的日志
#可选参数
-tf
--tail [number] #查看最后几条日志
docker top 容器ID #查看容器内部进程
docker inspect [可选参数] 容器 #查看容器元数据
#进入正在运行的容器
docker exec -it 容器ID bashshell #以交互方式进入正在运行的容器(进入一个新的终端)
docker attach 容器ID #以交互方式进入正在运行的容器(进入已打开的终端)
#容器内拷贝文件到主机
docker cp [可选参数] 容器ID:容器内路径 主机目标路径
docker镜像加载原理
UnionFS(联合文件系统):是一种分层、轻量级并且高性能的文件系统。镜像实际是由一层一层的文件系统组成,镜像加载时是一层一层的加载。
提交镜像
docker commit -m="描述信息" -a="作者" 容器ID 目标镜像名称:[标签]
#例
docker commit -m="add webapps" -a="jack" b9a1320a4f34 jack_tomcat:1.0
容器数据卷
容器的持久化和同步操作。同步操作相当于copy。
容器之间可以数据共享,容器删除,主机数据不会删除。容器停止运行,修改主机上的数据时,容器也会同步修改的。
修改容器数据时,可直接修改主机数据。
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止,但是一旦持久化到了本地,本地的数据是不会删除的。
使用数据卷
#一、使用命令直接挂载 -v
docker run -it -v 主机目录:容器目录
-v 容器内路径:[ro/rw] #改变读写权限,一旦改变了容器权限,容器对我们挂载出来的内容就有限定了,默认rw权限。设定了ro,只能从主机上操作,容器内不能操作。
#具名挂载和匿名挂载
#匿名挂载,不指定主机目录
-v 容器内路径
#查看所有卷volume
docker volume ls
#查看某个卷的详细信息
docker volume inspect 卷名
#具名挂载
-v 卷名:容器内路径
#3个容器数据卷同步,删除其中一个容器,另一容器的数据不会丢失。可实现mysql数据共享,数据同步。
#1.启动一个父容器,挂载数据卷
#2.启动子容器,使用--volumes-from挂载
--volumes-from 父容器名称
#3.启动第二个子容器,可以--volume-from挂载父容器或者子容器。
dockerfile
dockerfile是用来构建docker镜像的构建文件,命令脚本。
dockerfile文件可查看官方构建docker镜像的dockerfile文件。
构建docker镜像步骤:
1.编写一个dockerfile文件
2.docker build构建成为镜像
3.docker run运行镜像
4.docker push发布镜像,可以发布到dockerhub,阿里云等。
dockerfile文件指令
#解释
FROM #基础镜像
MAINTAINER #镜像作者,姓名、邮箱
RUN #镜像构建时需要运行的命令
ADD #添加一个压缩包,会自动解压。
WORKDIR #镜像的工作目录,进入容器时所在目录
VOLUME #挂载目录
EXPOST #暴露端口
CMD #指定容器启动时要运行的命令,只有最后一个生效。
ENTRYPOINT #指定容器启动时要运行的命令,可以追加命令。
ONBOUILD #当构建一个被继承dockerfile会运行ONBUILD,触发指令
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建时设置环境变量
#文件内容指令都为大写
#格式:指令 参数
#例1
#1.创建cnetos的dockerfile文件
FROM centos
MAINTAINER jack<aaa@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash
#2.使用docker build构建镜像
docker build -f mydockerfile-Centos -t mycentos:1.0 .
#解释
-f #指定dockerfile文件路径
-t #指定构建的镜像名称
. #为当前目录
#例2
#1.准备镜像文件、readme.txt文件、tomcat压缩包、jdk压缩包下载到本地
#dockerfile文件名为官方Dockerfile时build镜像时可不用指定dockerfile路径
#2.创建tomcat的dockerfile文件
FROM centos
MAINTAINER jack<aaa@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-*** /usr/local/
ADD apache-tomcat-*** /usr/local
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.***
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-***
ENV CATALINA_BASH /usr/local/apache-tomcat-***
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-***/bin/startup.sh && tail -f /usr/local/apache-tomcat-***/logs/catalina.out
#3.构建镜像
docker build -t mytomcat:1.0 .
#4.创建并启动容器
docker run -d -p 9090:8080 --name mytomcat01 -v /home/jack/build/mytomcat/test:/usr/local/apache-tomcat-***/webapps/test -v /home/jack/build/mytomcat/tomcatlogs/:/usr/local/apache-tomcat-**/logs/ mytomcat:1.0
#5.测试
#6.发布镜像
#发布到dockerhub
docker login -u 用户名 -p 密码 #登陆dockerhub
docker push 用户名/mytomcat:1.0
#发布到阿里云镜像
#参考https://cr.console.aliyun.com/repository/cn-hangzhou/wjk-registry/test/details
docker网络
默认docker0网络
容器内部和主机之间可以直接通信,容器之间也可以直接通信。
每启动一个容器,docker都会给docker容器分配一个IP地址,只要安装了docker,就会自动生成一个docker0网卡,使用桥接模式,使用veth-pair技术。veth-pair是一对虚拟设备接口,他们是成对出现的。
每启动一个容器,主机与容器都会生成一对网卡。
只要删除一个容器,与之对应的一对网卡也会删除。
#查看容器内网卡
docker run -d -P --name tomcat01 ip add
#使用容器名称进行通信--link,如果两端都需要访问,两端都需要配置--link。--link原理是在容器内hosts文件中增加IP映射。
docker run -d -P --name tomcat02 --link tomcat01 tomcat
#查看容器详细信息
docker network inspect 容器ID
自定义网络
优点:不同集群使用不同网络,可保障集群的安全
#查看所有docker网络
docker network ls
#网络模式
bridge #桥接
none #不配置网络
host #和宿主机共享网络
container #容器网络联通(不常用)
#创建网络,直接启动容器默认使用docker0,也就是bridge,域名是不能访问的,可使用--link
docker network create --drive bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynet(#mynet为自定义名称)
#查看网络信息
docker network ls
docker network insepct mynet
#使用自定义网络启动容器,可以直接使用容器名互相ping通、通信
#加--ip可指定分配的IP地址
docker run -d -P --name tomcat-net-01 --net mynet --ip 192.168.1.1 tomcat
docker run -d -P --name tomcat-net-02 --net mynet --ip 192.168.1.2 tomcat
#打通默认网络和自定义网络,一个容器两个IP地址
docker network connect mynet tomcat01
#如果要夸网络操作,就需要使用docker network connect进行连通
docker使用过程中遇到的问题
问题:
问题1:
[aaa@qq.com ~]# docker run -d -p 9000:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
d5b2bd5a7bc4895a973fe61efd051847047d26385f65c278aaa09e4fa31c4d76
docker: Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen (6bda693d1143657e46bee0300276aa05820da2b21a3d89441e820d1a274c48b6): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 9000 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
原因:
docker服务启动时定义的自定义链DOCKER由于某种原因被清掉
重启docker服务及可重新生成自定义链DOCKER
解决:
重启docker服务后再启动容器
systemctl restart docker
docker run **
问题2:
上一篇: php 抽象类的简单应用