最近看了好多docker的资料,找了一些尚硅谷docker的教学视频,大概总结了一下前前后后的学习笔记。分享给大家。
安装
Docker的基本组成
镜像
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
容器
Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库
仓库(Repository)是集中存放镜像文件的场所。
仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com/),
存放了数量庞大的镜像供用户下载。包括国内的公开仓库包括阿里云 、网易云 等
总结
需要正确地理解仓储/镜像/容器这几个概念:
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
* image 文件生成的容器实例,本身也是一个文件,称为镜像文件。
* 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
* 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。
安装步骤
centos6和7 过程不太一样
我本地有docker,所以该章节没有验证过
以centos7为例
1、虚拟机上网。。。
2、yum安装gcc,
yum -y install gcc
yum -y install gcc-c++
3、卸载旧版本
yum -y remove docker docker-common docker-selinux docker-engine
新版本看官网卸载办法
4、安装需要的软件包:yum intall -y yum-utils device-mapper-persistent-data lvm2
5、设置stable镜像仓库:yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
6、更新yum软件包索引:yum makecache fast
7、安装Docker CE,yum -y install docker-ce
8、启动docker,systemctl start docker && systemctl enable docker
9、测试:
docker version
docker run hello-world
10、配置镜像加速器:
mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker
11、卸载
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker
命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images
docker search
docker search [某个镜像的名称]
docker search [options] 镜像名称
options:
--no-tranc:显示完整的镜像描述
-s:列出收藏数不小于指定值的镜像
--automated:只列出automated build类型的镜像
docker pull 镜像名称
docker rmi hello-world/
删除全部镜像:docker rmi -f $(docker images -qa)
容器命令
新建并启动容器:
docker run [options] IMAGE [command] [arg...]
options:
--name="容器新名称" 为容器指定一个名称
-d:后台运行容器,并返回容器ID,即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPORT:containerPort
containerPort
列出当前正在运行的容器:docker ps 【options】
options:
-a:列出当前正在运行的容器+历史上运行过的
-l:显示最近创建的容器
-n:显示最近n个创建的容器
-q:静默模式,只显示容器编号
--no-trunc:不截断输出
退出容器:
exit:容器停止退出
ctrl+P+Q:容器不停止退出
启动容器:docker start 容器ID或名称
重启容器:docker restart 容器ID或名称
停止容器:docker stop 容器ID或名称
强制停止容器:docker kill容器ID或名称
删除已停止的容器:
docker rm 容器ID
docker rm -f $(docker ps -a -q)
docker ps -a -q|xargs docker rm
重要:
启动守护式容器:docker run -d 容器名
#使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a 进行查看, 会发现容器已经退出
很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如
service nginx start
但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,
这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.
所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行
查看容器日志:docker logs -f -t 容器ID/docker logs -f -t --tail n 容器ID
查看容器内运行的进程:docker top 容器ID
查看容器内部的细节:docker inspect 容器ID
进入正在运行的容器并以命令行交互:
docker exec -it 容器ID /bin/bash
重新进入:docker attach 容器ID
从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径
Docker镜像
UnionFS-联合文件系统
是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
端口映射
docker run -it -p 8888:8080 tomcat:latest
-p:主机端口号:docker容器端口号
-P:随机端口号
docker commit
以当前运行的docker作为实例复制一个副本镜像
docker commit -a="作者" -m=“备注信息” 运行实例的容器ID 复制副本镜像名称:自定义版本
docker commit -a="swz" -m="tomcat with docs" bdc80ace28e0 swz/tomcat:1.2
docker容器的数据卷
概念
是什么:内存的数据保存到磁盘,容器关闭,数据保存到数据卷中;
干什么:数据持久化,容器之间的集成和持久化;容器到主机,主机到容器的数据共享
相当于容器的外置磁盘
数据卷
命令添加
1、docker run -it -v /宿主机绝对路径:/容器内路径 镜像名称
docker run -it -v /myDataVolume:/dataVolumeContainer centos //主机和容器内的目录都是自动创建的 -v有新建的功能
docker inspect 容器ID,可以看到挂载效果
容器内外修改文件都可以实现同步,容器停止运行,主机修改文件后,容器下次运行会加载修改结果
2、指定数据卷权限
docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
Dokerfile添加
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
说明:
出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。
由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。
容器会自动在内部创建VOLUME指定的目录,因为不能指定主机目录,docker会自动创建主机对应的目录,通过docker inspect 容器ID,可以查看对应的目录
数据卷容器--volumes-from
docker run -it --name dc02 --volumes-from dc01 swz/centos
1、启动一个有数据卷的父容器
2、创建一个新的容器,制定数据卷来自的父容器
3、子容器和父容器之间实现数据卷共享
Dockerfile
概念
1、Dockerfile是构建Docker镜像的构建文件,是一系列命令和参数构成的脚本
2、三步骤:编写Dockerfile,docker build ... ,docker run ...
3、centos例子:centos8-Dockerfile
Dockerfile构建过程解析
基础知识
1、每条指令必须以大写字母开头,且后面要跟随至少一个参数
2、从上到下,顺序执行
3、#注解
4、每条指令都会创建一个新的镜像层,并对镜像层进行提交
执行流程
1、docker从基础镜像运行一个容器
2、执行一条制定对容器作出修改
3、执行类似docker commit 的操作提交一个新的镜像层
4、docker再基于刚提交的镜像运行一个新的容器
5、执行Dockerfile中的下一条执行,循环2-3-4步骤,直到所有指令都执行完成
总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
* Dockerfile是软件的原材料
* Docker镜像是软件的交付品
* Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。
Dockerfile指令
FROM
基础镜像,当前新景祥是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的端口
WORKDIR
制定的创建容器后,默认登陆进来的工作目录,一个落脚点
ENV
用来构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;
也可以在其它指令中直接使用这些环境变量,
比如:WORKDIR $MY_PATH
ADD
将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包
COPY
类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置
COPY ser dest
COPY ["src","dest"]
VOLUME
容器数据卷,用户数据保存和持久化工作
CMD
指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
总结
案例
Base镜像(scratch)
Docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
自定义镜像mycentos
1、现状:登录根目录,vim,ifconfig都不存在
编写Dockfile
FROM centos
MAINTAINER swz
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
docker build -t mycentos:1.3 .
docker run -it mycentos:1.3
docker history 镜像ID
CMD/ENTRYPOINT镜像案例
1、都是指定一个容器启动时要运行的命令
2、CMD:
I)Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
II)docker run -it -p 8888:8080 tomcat 正常情况下会运行tomcat,看到日志;
docker run -it -p 8888:8080 tomcat ls -l 列出文件目录,tomcat不会运行
3、ENTRYPOINT:
I)docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合
II)Case:制作CMD版可以查询IP信息的容器
自定义镜像Tomcat9
1、mkdir -p /root/mydocker/mytomcat
2、将jdk和tomcat的安装压缩包拷贝进上一步的目录
3、编写Dockerfile
FROM centos
MAINTAINER swz
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY readme.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.24.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_73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.24
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.24
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.5.24/bin/startup.sh" ]
#CMD ["/usr/local/apache-tomcat-8.5.24/bin/catalina.sh","run"]
# CMD ["sh","/usr/local/apache-tomcat-8.5.24/bin/startup.sh"]
CMD /usr/local/apache-tomcat-8.5.24/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.24/bin/logs/catalina.out
4、docker build -t swz/tomcat:1.3 .
5、docker run -d -p 9080:8080 --name swztomcat -v /root/mydocker/mytomcat/apps01:/usr/local/apache-tomcat-8.5.24/webapps/apps01 -v /root/mydocker/mytomcat/logs/:/usr/local/apache-tomcat-8.5.24/logs --privileged=true swz/tomcat:1.3
总结
Docker常用安装
总体步骤
搜索镜像
拉取镜像
查看镜像
启动镜像
停止容器
移除容器
安装tomcat
1、docker hub上查找tomcat镜像
docker search tomcat
2、从docker hub上拉取镜像到本地
docker pull tomcat
3、docker images查看是否拉取到想要的tomcat
4、使用tomcat镜像创建容器(运行镜像)
docker run -it -p 8080:8080 tomcat
安装mysql
1、docker hub上查看mysql镜像
2、从docker hub上拉取mysql镜像到本地标签为5.6
3、使用mysql5.6镜像创建容器
docker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
命令说明:
-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。
--name mysql:运行服务名字
-v
/zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。
-v
/zzyyuse/mysql/data:/var/lib/mysql :将主机/zzyyuse/mysql目录下的data目录挂载到容器的 /var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
-d mysql:5.6 : 后台程序运行mysql5.6
docker run -p 3306:3306 --name mysql -v /root/mydocker/mysql/conf:/etc/mysql/conf.d -v /root/mydocker/mysql/logs:/logs -v /root/mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
4、mysql的数据库备份
docker exec myql服务容器ID sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /zzyyuse/all-databases.sql
安装redis
1、从docker hub上拉取redis镜像到本地标签为3.2
2、使用镜像
3、在主机目录下新建redis.conf文件
4、docker run -p 6379:6379 -v /root/mydocker/redis/data:/data -v /root/mydocker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
安装NGINX
1、docker pull nginx:1.17
2、在相关目录下先创建nginx.conf文件,不然会报错
3、docker run -d -p 8082:80 --name nginx-test -v /root/mydocker/nginx/www:/usr/share/nginx/html -v /root/mydocker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/mydocker/nginx/logs:/var/log/nginx nginx:1.17
本地镜像发布到阿里云
本地镜像发布到阿里云流程
镜像的生成方法
1、先运行容器:docker run -it mycentos(镜像名称)
2、提交容器镜像:
docker commit -a swz -m "test centos 1.4 from 1.3 " 0344b515c925 swz/centos:1.4
将本地镜像推送到阿里云
将阿里云的镜像下载到本地
阿里云上创建镜像之后,官网上都有说明,不再补充