简介
Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
运行中的这个镜像称为容器,容器启动是非常快速的。
核心概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
安装docker
1.检查内核版本,必须是3.10及以上
uname -r
2安装docker.
yum install docker
3.启动docker
systemctl start docker
docker -v 查看版本,检查有没有成功安装
5、开机启动docker
systemctl enable docker
docker常用命令&操作
1)、镜像操作
操作 | 命令 | 说明 |
---|---|---|
检索 | docker search 关键字 | eg:docker search redis 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 |
拉取 | docker pull | 镜像名:tag :tag是可选的,tag表示标签,多为软件的版本,默认是latest (可到hub去查看,eg:docker pull mysql:5.5) |
列表 | docker images | 查看所有本地镜像 |
删除 | docker rmi image-id | 删除指定的本地镜像 (id通过docker images查看) |
2)修改镜像源(一定要修改,不然慢死)
修改 /etc/docker/daemon.json ,写入如下内容(如果文件不存在请新建该文件)
# 内容:
vim /etc/docker/daemon.json
---------
{
"registry-mirrors":["http://hub-mirror.c.163.com"]
}
-----------
sudo systemctl daemon-reload//重新加载
-----------
sudo systemctl restart docker//重启
国内镜像源 | 地址 |
---|---|
Docker官方中国区 | https://registry.docker-cn.com |
网易 | http://hub-mirror.c.163.com |
中国科技大学 | https://docker.mirrors.ustc.edu.cn |
阿里云 | https://pee6w651.mirror.aliyuncs.com |
(推荐:也可以在阿里云官网搜索容器镜像服务,创建一个镜像服务,从镜像加速器获取地址)
3)、容器操作
步骤(以tomcat为例:):
1.下载tomcat镜像
docker pull tomcat
如需选择具体版本,可以在https://hub.docker.com/搜索tomcat
docker pull tomcat:7.0.96-jdk8-adoptopenjdk-hotspot
2.根据镜像启动容器,不加TAG默认latest,如果没有下载latest会先去下载再启动
#错误的创建,没有端口映射,正确的在下方
docker run --name mytomcat -d tomcat:latest
–name:给容器起个名字
-d:后台启动,不加就是前端启动,然后你就只能开一个新的窗口连接,不然就望着黑乎乎的窗口,啥也干不了,Ctrl+C即可退出,当然,容器也会关闭
完整命令:
docker run -it -p 8888:8888 --name test (-v id:文件 文件) jiang/centostest (/bin/bash,dockerfile后面已有该CMD,直接进入该容器)
docker run -p 8888:8888 --name test (-v id:文件 文件) -d jaing/centostest (在后台运行,但如果前台没有一个进程会自动结束,因为-d命令会覆盖CMD)
docker run -it --name dc02 --volumes-from dc01 tulong/centos通过数据卷容器创建容器实现共享
3.查看运行中的容器
docker ps
4.停止运行中的容器
docker stop 容器的id
# 或者
docker stop 容器的名称,就是--name给起的哪个名字
5.查看所有的容器
docker ps -a
6.启动容器
docker start 容器id/名字
7.删除一个容器
docker rm 容器id/名字
8.启动一个做了端口映射的tomcat
docker run -d -p 8888:8080 tomcat
#或者
docker run -p 8888:8080--name tomcatt -d tomcat
-d:后台运行
-p: 将主机的端口映射到容器的一个端口 主机端口(8888):容器内部的端口(8080)
外界通过主机的8888端口就可以访问到tomcat,前提是8888端口开放
注意阿里云环境下需要配置(搞了我好久):
docker exec -it tomcat 容器id(通过docker ps查看) /bin/bash
rmdir webapps
mv webapps.dist webapps
因为所有的文件都在webapps.dist下,而访问的是webapps下的内容
9.关闭防火墙
# 查看防火墙状态
service firewalld status
# 关闭防火墙
service firewalld stop
#设置防火墙对该端口不设拦截(推荐)
iptables -I INPUT -p tcp --dport 8889 -j ACCEPT
#或者
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --reload #重新加载
firewall-cmd --zone=public --query-port=22/tcp #查询是否生效
firewall-cmd --zone=public --remove-port=22/tcp --permanent #限制端口
firewall-cmd --zone=public --list-ports #查看端口
阿里云环境下还要增加一个安全组
10.查看容器的日志
docker logs 容器id/名字
docker logs -ft --tail 倒数几条 容器ID
11.可以用一个镜像启动多个容器
docker run -d -p 8889:8080 tomcat
12. 查看容器的内部细节
docker inspect 容器ID
13. 进入正在运行的容器并以命令行交互:
直接进入容器启动命令的终端,不会启动新的进程
docker attach 容器ID
是在容器中打开新的终端,并且可以启动新的进程
docker exec -it 容器ID /bin/bash
14. 退出容器
exit 容器停止并退出
Ctrl + P + Q 容器不停止退出
15.从容器内拷贝文件到主机上(主机到容器类似):
docker cp 容器ID:容器内路径 目标主机路径
16.镜像Commit
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
17.build镜像
docker build -f /mydocker/dockerfile(文件路径) -t tulong/centos (镜像名) . (注意最后面有一个点)
18.数据卷容器
docker run -it --name dc02 --volumes-from dc01 tulong/centos
配置文件
每次修改配置文件记得重启一下容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器.
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/
可以参考每一个镜像的文档
容器数据卷
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用容器数据卷。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数卷,其特点为:
- 数据卷可在容器之间共享或重用数据;
- 卷中的更改可以直接生效;
- 数据卷中的更改不会包含在镜像的更新中;
- 数据卷的生命周期一直持续到没有容器使用它为止。
数据卷
直接命令添加
将容器与宿主机之间文件绑定:
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
查看数据卷是否挂在成功:
docker inspect 容器ID
容器与宿主机之间数据共享:
容器停止退出后,主机修改后数据同步。
只读权限:docker run -it -v /宿主机绝对路径目录:/容器内目录 ro 镜像名
Dockerfile添加
Dockerfile为Image的描述文件
可在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷:
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] #在容器中创建这两个文件。并且当run的时候会自动在宿主机中某个路径下创建两个文件进行挂载,具体用inspect查看
CMD echo "finished,--------success1"
CMD /bin/bash
build后生成新镜像:
docker build -f /mydocker/dockerfile -t tulong/centos
run容器后自动挂载了两个目录/dataVolumeContainer1
和/dataVolumeContainer2
数据卷容器
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器.
dc02继承自dc01:
docker run -it --name dc02 --volumes-from dc01 tulong/centos
dc03继承自dc02
在dc01、dc02、dc03任意一个添加文件其它两个都会存在。
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
DockerFile
概念
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构件步骤:
- 编写DockerFile文件
- docker build 创建镜像
- docker run 运行镜像
CentOS6.8 的 Dockerfile:
FROM scratch
MAINTAINER The CentOS Project <[email protected]>
ADD c68-docker.tar.xz /
LABEL name="CentOS Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="2016-06-02"
Default command
CMD ["/bin/bash"]
Dockerfile构建解析过程
Dockerfile文件内容:
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程:
- Docker从基础镜像运行一个容器;
- 执行一条指令并对容器作出修改;
- 执行类似Docker commit的操作提交一个新的镜像层;
- Docker再基于刚提交的镜像运行一个新容器;
- 执行Dockerfile中的下一条指令直到所有指令都执行完成。
Dockerfile保留字指令
FROM:基础镜像,当前镜像是基于那个镜像的;
MAINTAINER(maintainer):作者、邮箱;
RUN:容器构建时需要运行的命令;
EXPOSE:暴露端口号,启动容器的时候还需使用 –p 指定端口;
WORKDIR(workdir):指定在创建容器后,终端默认登录后进来的工作目录,一个落脚点,默认根目录,通常绝对路径,CMD ENTRYPOINT 都会在这个目录下执行;
ENV:构建镜像的过程中设置环境变量, 构建和运行时都有效可以使用$引用;
ADD:将宿主机目录下的文件拷贝到镜像且会自动处理URL和解压tar压缩包;
COPY:拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/复制到新的一层镜像内<目标路径>的位置。语法:COPY src dest COPY [“src”, “desc”];
VOLUME:容器数据卷, 数据保存和持久化;
USER:指定该镜像由什么用户运行,不指定由root 运行;
CMD:指定容器启动时要运行默认的命令,Dockerfile中可以有多个cmd , 但只有最后一个生效;
ENTRYPOINT(entrypoint):指定容器启动时要运行的命令。
ONBUILD RUN 当子Dockerfile执行构建build的命令时,会触发父镜像的这个命令
案例一:封装CentOS
自定义mycentos目的使镜像具备:登陆后的默认路径、vim编辑器、查看网络配置ifconfig支持。
FROM centos
MAINTAINER zzyy<[email protected]>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo “success--------------ok”
CMD /bin/bash
案例二:自定义Tomcat
step1: 首先创建文件夹存放jdk与tomcat的安装包
mkdir -p /tulong/mydockerfile/tomcat9
step2:将jdk和tomcat安装的压缩包拷贝进上一步目录
apache-tomcat-9.0.8.tar.gz
与jdk-8u171-linux-x64.tar.gz
step3:在/tulong/mydockerfile/tomcat9目录下新建Dockerfile文件
FROM centos
MAINTAINER zzyy<[email protected]>
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY c.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
#["catalina.sh", "run"] 可以运行一个服务,而不至于-d创建一个容器后台运行时因为没有事可做直接退出
step4:构件镜像
docker build -t mytomcat
step5:运行容器
docker run -d -p 9080:8080 --name myt9
-v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test
-v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs
--privileged=true zzyytomcat9
注:test目录中加入war包可以挂载到容器内,容器中logs文件中产生的日志可以同步到主机上。
Docker全流程示意图:
安装myqsl(5.5版本,5.7版本有问题)
安装MySQL示例
获取镜像
docker pull mysql:5.5
创建容器
docker run -p 3306:3306 --name mysqldb -e MYSQL_ROOT_PASSWORD=123456-d mysql:5.5
出现错误,删除该容器,并重启服务
systemctl restart docker
配置防火墙
iptables -I INPUT -p tcp --dport 8889 -j ACCEPT
配置阿里云安全组
其他的几个高级操作
docker run --name mysql03 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面
改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
指定mysql的一些配置参数
安装Redis
docker run -p 6379:6379 --name redis -v /root/redis/data:/data -v /root/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis redis-server /usr/local/etc/redis/redis.conf --appendonly yes --requirepass "xxx"
安装nginx
记得挂载conf.d和nginx.conf,其中conf.d里有一个default.conf,并且还需要挂载一个存放静态资源的文件夹,不然很麻烦。
[root@iZ2ze71edtq2kxflzq2m01Z conf.d]# docker run --name nginxtest -d -p 80:80 -v /root/nginx/conf.d:/etc/nginx/conf.d -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html nginx