docker初学笔记
Docker的基本组成docker利用容器(Container)独立运行的一个或一组应用;容器时用镜像创建的运行实例容器可以被启动、开始i、停止、删除。每个容器都是相互隔离的】保证安全的平台;docker相当于一个精简版的虚拟机,只保留了运行应用是所需要的库(包括root用户权限、进程空间、用户空间和网络空间等和运行再其中的应用程序),摒弃了硬件模拟等;docker三要素镜像(images)相当于
Docker的基本组成
docker利用容器(Container)独立运行的一个或一组应用;
容器时用镜像创建的运行实例
容器可以被启动、开始i、停止、删除。每个容器都是相互隔离的】保证安全的平台;
docker相当于一个精简版的虚拟机,只保留了运行应用是所需要的库(包括root用户权限、进程空间、用户空间和网络空间等和运行再其中的应用程序),摒弃了硬件模拟等;
docker三要素
- 镜像(images)相当于每个容器的模板
- 容器(container)每个容器的实例,应用都是部署在容器中的
- 仓库(repository)相当于java中的maven仓库,有一些打包好的镜像
镜像:是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的所哟内容,包括代码、运行时、库、环境变量和配置文件
Docker镜像都是只读的,当容器地洞是,一个新的可写层被加载到镜像顶部。这一层通常被叫做容器层,容器层之下的都叫做镜像层;
docker的安装建议根据官网提示进行操作
https://docs.docker.com/engine/install/centos/
由于docker仓库默认使用海外镜像库,建议配置成国内阿里云或者网易镜像库
systemctl daemon reload
重新加载镜像配置文件systemctl restart docker
重启docker服务
配置疑问可在阿里云查找文档dev.aliyun.com
docker常用命令
-
docker -version //版本号
-
docker -info //容器信息
-
docker --help //docker帮助命令
-
docker run [镜像名称] //运行一个镜像的实例(docker run 镜像)
-
docker search 【镜像名称】从镜像仓库中搜索镜像
docker 镜像命令
docker images //列出本地目前已有的镜像
1. REPOSITORY 表示镜像源
2. TAG:镜像的标签(docker run时不加tag默认就是latest)
3. IMAGE ID:镜像的id
4. CREATED创建时间
5. size镜像大小
docker images -a(镜像是分层的)显示所有包含中间镜像
docker images -qa 显示当前镜像所有镜像的id
docker images --digests显示镜像的摘要信息
doucker pull [镜像名字] TAG下载镜像(如果不加tag的话等价于下载最新版的,等价于 docker pull [镜像名]:latest)
docker images -qa //展示所有本地docer镜像id
docker rmi [唯一镜像名或镜像id] :tag //删除镜像
- docker rmi -f [唯一镜像名或镜像id] :tag //强制删除删除镜像
- 同时删除多个镜像以空格分隔
- docker rmi -f ${docker images -qa}删除所有本地镜像
docker容器命令
(有镜像才能创建容器)所以在创建容器前要先pull下相应的镜像
-
新建并启动容器 doker run [options] --name [镜像id]
* --name=’容器的新名字‘:为容器指定一个名称(如果不指定name则 默认随机分配)
* options:启动容器时需要的启动模式通常使用-it
* -i:以交互模式运行容器,通常与-t同时使用(启动容器后进行交互)
* -t:为容器重新分配一个伪终端,通常与-i同时使用(登录容器后创建一个伪终端**命令窗口)
* -d:后台运行容器,并返回容器id
* -P:随机端口映射
* -p:指定端口映射,有以下四种格式
1. hostPort:containerPort
比如docker run -it -p 8888:8080 【镜像id】,表示将容器中的8080端口启动容器后映射到宿主的8888端口上面的大写P是随机分配↑
-
列出当前所有正在运行的docker容器: docker ps
- OPTIONS
- -a 列出当前所有正在运行的容器+历史上运行过的
- -l:显示最近创建的容器(上一个容器)
- -n:显示最近n个创建的容器
- -q静默模式,只显示容器编号
- –no-trunc:不截断输出
-
退出容器 exit或者ctrl+p+q
- exit关闭容器并退出
- ctrl+P+Q退回到宿主机但不关闭容器
-
启动已经退出的容器doker start[容器id]
-
重启容器:docker restart [容器id]
-
关闭容器:docker stop
-
强制关闭容器:docker kill [容器id]
-
删除已停止的容器:docker rm [容器id](多个容器空格间隔,docker -f 强制删除)批量删除参照批量删除镜像,注意rm是删除容器,rmi是删除镜像
-
后台启动容器docker run -d --name [镜像id]
- 问题:docker ps -a查看时发现进程容器已经退出,是因为Docker容器后台运行是必须有一个前台进程是启动的,容器运行的命令如果不是一些挂起的命令比如(top、tail),容器就会自动退出,比如容器当中部署了nginx是以守护进程的方式运行的,也会导致容器自动退出,所以要运行的程序要以前台进程的形式运行 例如docker run -d centos /bin/sh -c “while true;do echo hello xxxx;lsleep 2;done” shell编程没两秒钟打印hello xxxx
-
查看容器日志:docker logs -t -f --tail [容器id]
- -t 加入时间戳
- -f跟随最新的日志打印
- –tail xx 显示最后xx条
-
查看容器内的进程:docker top [容器id]
-
查看容器内部细节:docker inspect 容器id
-
进入正在运行的容器:docker exec -it 【容器id】或者docker attach 【容器id】
* docker attach 【容器id】 进入到容器的根目录
* docker exec -it 【容器id】【需要在容器中执行的命令】在容器外面进行容器中的命令操作例如:docker exec -it 【容器id】 ls -l /tmp 表示在宿主机中查看容器内tmp目录下的内容,但是并没有进入到容器 -
从容器中拷贝数据到宿主机:docker cp 【容器id】:容器内部路径 目的主机路径
-
提交容器副本使之成为一个新的容器镜像:docker commit
- docker commit -m=“提交的描述信息” -a “作者" [容器id] 要创建的目标镜像名称:[标签名]
Docker容器数据卷
即:容器关闭后运行数据就丢失了,容器数据卷既是容器内的运行数据持久化
Docker的理念:
- 将运用于运行的而环境打包形成容器运行,容器内的运行数据可以持久化
- 容器间的数据可以共享(Docker容器产生的数据,如果用docler commit是生成新的镜像是可以保存的)
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
数据卷的添加
- 直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
** 如果写权限不够,可在命令最后添加docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名 --privileged=true
1.1 -v /宿主机绝对路径目录:/容器内目录 命令会自动为宿主机和容器创建相应的目录,相当于mkdir,并建立容器于宿主机的连接实现数据共享
1.2 查看数据卷是否挂载成功
docker inspect [镜像id]
1.3 容器和宿主机之间数据共享
1.4 容器停止退出后,如果重新启动容器,宿主机修改的数据也会同时同步到容器
2. 命令(带权限)
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
容器内的目录只读不可写
- DockerFile添加
(例):
使用VOLUME指给镜像添加一个或多个数据卷
VOLUME[“容器目录1”,“容器目录2”,“容器目录3”,…]
注意volume指令在dockerFile中只支持容器地址;因为考虑到镜像移植和分享的考虑,目录会有差异;所以VOLUME无法像直接用命令添加数据卷一样直接指定宿主机的关联目录,但会在宿主机随机生成一个目录进行关联,后面镜像创建后使用docker inspect [容器id]
可查看
3. 1. 根目录下新建目录mkdir /mydocker; cd mydocker
3. 2. 编写dockerFile;vim dockerfile;
# volume test
FROM cenos #以哪个镜像作为模板,类似java中的extends
VOLUME ["dataVolumeContainer1","/dataVolumeContainer2"] #在当前的镜像下新建两个数据卷
CMD echo "finished,---------success1"; # 打印提示
CMD /bin/bash
#######
3. 3. 构建生成新镜像
docker build -f /mydocker/dockerfile -t zp/centos .
-f 文件,指定dockerfile路径为/mydocker/dockerfile
-t 命名空间,指定构建的新镜像的名字为zp/centos
. 新镜像保存到当前路径下
数据卷容器
命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂在数据卷的容器,称之为数据卷容器;
类似于主从复制,其他机器挂载到已经有有数据卷的容器上,那么这个容器就是数据卷容器,从而实现了父容器到子容器的数据共享;
启动一个数据卷容器(即数据卷容器)
docker run -it --name dc01 ap/centos
启动一个挂载到dc01的容器
dco2
docker run -it --name dc02 --volumes -from dc01 ap/centos
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
DockerFile(重点)!!!
- 每天保留字指令都必须为大写字母,且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
- docker从基础镜像运行一个容器
- 执行一条指令并对容器做出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
FROM
基础镜像,当前编写的这个新的镜像是基于哪个镜像的
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
EXPOSE
当前容器对外暴露的端口号
WORKDIR
指定在容器创建后,终端默认登录进来的工作目录,一个落脚点;
如果没有指定则默认进入根目录
ENV
用来在构建镜像过程中设置环境变量
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样
比如:
定义:ENV MY_PATH /usr/local
使用:WORKDIR $MY_PATH
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY
类似ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置,但不会处理URL和解压缩
COPY src dest #shell脚本的写法
COPY [“src”,“dest”]
二者都可
VOLUME
容器数据卷,用于数据保存和持久化
CMD
指定一个容器启动时要运行的命令
CMD指令的格式和RUN相似,也是有两种格式:
shell 格式:CMD<命令>
exec格式:CMD [“可执行文件”,“参数1”,“参数2”…]
参数列表格式:CMD [“参数1”,“参数2”,…]在指定了ENTRYPOINT指令后,用CMD指定更具体的参数。
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
ENTRYPOINT与CMD命令的区别就是,在运行run命令时,追加的参数会覆盖CMD的命令,而ENTRYPOINT的命令是追加
ONBUILD
触发器:
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后父镜像的onbuild被触发
也就是当有镜像被继承时,当build新镜像时将执行被继承镜像dockerfile中的ONBUILD指令
USER
指定用户组或用户id可以运行此Dockerfile
.dockerignore
添加构建镜像需要忽略的
docker history [镜像名]
- 安装gcc
yum -y install gcc
yum -y install gcc-c++
- 根据docker官网要求卸载旧版
更多推荐
所有评论(0)