DOCKER 命令
帮忙命令
docker --help
镜像命令
1、docker images:列出当前主机上的镜像
docker images centos
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE_ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一仓库源可以有多个TAG,代表这个仓库源的不同个版本,我们使用REPOSITORY:TAG来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker将默认使用ubuntu:latest镜像。
OPTIONS说明:
-a:列出本地所有的镜像(含中间映像层)
-q:只显示镜像ID。
--digests:显示镜像的摘要信息
--no-trunc:显示完整的镜像信息
2、docker search
docker search xxxx(镜像名字,如:tomcat)
从网站【https://hub.docker.com】上搜索
OPTIONS说明:
--no-trunc:显示完整的镜像描述
-s:列出收藏数不小于指定的镜像
--automated:只列出automated build类型的镜像
3、docker pull
docker pull tomcat 等价于 docker pull tocat:latest
3、docker rmi
docker rmi hello-world
docker rmi -f hello-world:latest :强制删除
docker rmi -f hello-world ngix tomcat :删除多个
docker rmi -f $(docker images -qa) : 删除全部镜像
容器命令
1、docker run 新建容器
docker run -it --name test centos
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name "容器新名字":为容器指定一个名称;
-d:后台运行容器,并返回容器ID,也即启动守护式容器;
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
2、docker ps 列出正在运行的容器
OPTIONS说明(常用):
-a:列出当前所有正在运行的容器+历史上运行过的
-l:显示最近创建的容器。
-n:显示最近n个创建的容器。(docker ps -n 5:显示最近创建的5个容器)
-q:静默模式,只显示容器编号。
--no-trunc:不截断输出。
3、退出容器,两种方式:
一、exit:容器停止退出
二、ctrl+P+Q:容器不停止退出
4、docker start 容器ID或者容器名 :启动容器
5、docker restart 容器ID或者容器名 :重启容器
6、docker stop 容器ID或者容器名 :停止容器
7、docker kill 容器ID或者容器名 :强制停止容器
8、docker rm 容器ID或者容器名 :删除容器 加-f:强制删除
9、一次性删除多个容器:
docker rm -f $(docker -a -q)
docker ps -a -q | xargs docker rm
10、启动守护式容器:
#使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a进行查看,会发现容器已经退出
很重要的要说明的一点:Docker容器后台运行,就必须有一个前台进程
容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是自动退出的。
这个是docker的机制问题,比如你的web容器,我们以ngix为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service ngix start
但是,这样做,ngix为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了。
所以,最佳的解决方案是,将你要运行的程序以前台进程形式运行。
docker run -d centos /bin/sh -c "while true; do echo hello zzyy; sleep 2; done"
11、查看容器日志:
docker logs -f -t --tail 容器ID
-t:是加入时间戳
-f:跟随最新的日志打印
--tail 数字:显示最后多少条
12、查看容器内运行的进程
docker top 容器ID
13、查看容器内部细节
docker inspect 容器ID
14、进入正在运行的容器并用命令行与之交互
docker exec -it 容器ID bashShell
重新进入docker attach 容器ID
上述两个区别:
attach:直接进入容器启动命令的终端,不会启动新的进程
exec:是在容器中打开 新的终端,并且可以启动新的进程
例:docker exec -t xxxxxx ls -l /tmp
docker exec -it xxxxxx ls -l /tmp :在容器外对容器操作执行命令并返回结果
docker exec -it xxxxxx /bin/bash:进入容器再操作执行命令
15、从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
Docker 镜像
是什么
UnionFs(联合文件系统):Union文件系统(UnionFs)是一各分层,轻量级并且高性能的文件系统,它支持对文件系统 的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS.
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要是引导加载kernel,linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的作用权已由bootfs转交给内核,此时系统敢会卸载bootfs。
rootfs(root file system) ,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M?
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
为什么Docker镜像要采用这种分层结构呢?
最大的一个好处就是-共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为“容器层”,“容器层”之下的都叫“镜像层”。
Docker镜像Commit操作补充
docker commit提交容器副本使之成为一个新的镜像
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -a="zzyy" -m="del tomcat docs" d52498cea537 atauigu/tomcat02:1.2
Docker容器数据卷
是什么
Docker的理念
1、将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的。
2、容器之间希望有可能共享数据
Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。
为了能保存数据 在docker中我们使用卷。
能干嘛
卷就是目录 或文件,存在 于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的设计目的就是数据 的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除 其挂载的数据卷。
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中的更改不会包含在镜像的更新中
4、数据卷的生命同期一直持续到没有容器使用它为止
数据卷
容器内添加
一、直接命令添加
docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
带权限:
docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (容器只有读权限)
二、DockerFile添加
三、备注
Docker挂载主机目录Docker访问出现cannot open directory .:Permission denied
解决办法:在挂载目录后多加一个 --privileged=true参数即可。
数据卷容器
是什么
命名的容器挂载数据卷,其它容器通过 挂载 这个(父容器)实现 数据 共享,挂载数据卷的容器,称之为容器。
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
DockerFile解析
是什么
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建三步骤:
1、编写Dockerfile文件。
2、docker build
3、docker run
文件是什么样?
DockerFile构建过程解析
Dockerfile内容基础知识
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行。
3、#表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交。
Docker执行Dockerfile的大致流程
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器作出修改
3、执行类似docker commit的操作提交一个新的镜像层。
4、docker再基于刚提交 的镜像运行一个新容器。
5、执行dockerfile中的下一条指令直到所有指令都执行完成
小总结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段。
(1)Dockerfile是软件的原材料
(2)Docker镜像是软件的交付品
(3)Docker容器则可以认为是软件的运行态
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等。
2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一些人Docker镜像,当运行Docker镜像时,会真正开始提供服务。
3、Docker容器,容器是直接提供服务的。
DockerFile体系结构(保留字指令)
1、FROM
基础镜像,当前新镜像是基于哪个镜像的
2、MAINTAINER
镜像维护者的姓名和邮箱地址
3、RUN
容器构建时需要运行的命令
4、EXPOSE
当前容器对外暴露出的端口
5、WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
6、ENV
用来在构建镜像过程中设置环境变量
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量,比如:WORKDIR $MY_PATH
7、ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
8、COPY
类似ADD,拷贝文件和目录到镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置。
COPY src dest
COPY ["src","dest"]
9、VOLUME
容器数据卷,用于数据保存和持久化工作
10、CMD
指定一个容器启动时要运行的命令。
CMD指令的格式和RUN相似,也是两种格式:
(1)shell格式:CMD<命令>
(2)exec格式:CMD ["可执行文件","参数1","参数2"...]
dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
11、ENTRYPOINT
指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数
12、ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的unbuild被触发。
小总结:
案例
1、Base镜像(scratch)
Docker Hub 中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的
2、自定义镜像mycentos
(1)编写Dockerfile
FROM centos
MAINTAINER daixb<daixb@126.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 "success-------------------ok"
CMD /bin/bash
(2)构建
docker build -t 新镜像名字:TAG .
docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .
(3)运行
docker run -it mycentos:1.3
(4)列出镜像的变更历史
docker history 镜像名
3、自定义tomcat
(1)编写Dockerfile
FROM centos
MAINTAINER zzyy<zzyy@126.com>
#把宿主机当前上下文的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
(2)构建
docker build -t mytomcat9 .
(3)运行
docker run -d -p 9080:8080 --name myt9 -v /data/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /data/mydockerfile/tomcat9/logs:/usr/local/apache-tomcat-9.0.8/logs --privileged=true mytomcat9
Docker常用安装
总体步骤
安装Tomcat
1、docker search tomcat
2、docker pull tomcat
3、docker images
4、docker run -d -p 9080:8080 --name myt9 -v /data/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /data/mydockerfile/tomcat9/logs:/usr/local/apache-tomcat-9.0.8/logs --privileged=true mytomcat9
安装Mysql
1、docker search mysql
2、docker pull mysql:5.6
3、docker images
4、docker run -p 12345:3306 --name mysql -v /data/msysql/conf:etc/mysql/conf.d -v /data/mysql/logs:/logs -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
命令说明:
-p 12345:3306:将主机的12345端口映射到docker容器3306端口
--name mysql:运行服务名字
-v /data/mysql/conf:/etc/mysql/conf.d:将主机/data/mysql目录下的conf/my.cnf挂载到容器的/etc/mysql/conf.d
-v /data/mysql/logs:/logs:将主机/data/mysql/目录下的logs目录挂载到容器的/logs
-v /data/mysql/data:/var/lib/mysql:将主机/data/mysql目录下的data目录挂载到容器的/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码。
-d mysql:5.6:后台程序运行mysql5.6
5、与mysql交互
docker exec -it 容器ID /bin/bash
数据备份:
docker exec 容器ID sh -c 'exec mysqldump --all-databases -uroot -p "123456"' > /data/all-databases.sql
安装Redis
1、docker search redis
2、docker pull redis:3.2
3、docker images
4、docker run -p 6379:6379 -v /data/myredis/data:/data -v/data/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
5、交互
docker exec -it 运行着的Redis服务的容器ID redis-cli
本地镜像发布到阿里云
1、docker cmmit -a zzyy -m "new mycentos1.4 with vim add ifconfig" d2f590e000b2 mycentos:1.4
2、登录到阿里云设置全名空间和本地仓库镜像
3、docker login --username= registry.cn-hangzhou.aliyuncs.com
4、docker tag bd5s651fas34 registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycentos:1.4.1
5、docker push registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycentos:1.4.1
6、从阿里云下载镜像
docker pull registry.cn-hangzhou.aliyuncs.com/zzyybuy/mycentos:1.4.1
Centos7安装Docker Ce
1、安装参考官网手册(https://docs.docker.com)
2、确定你是CentOS7及以上版本
cat /etc/redhat-release
3、yum安装gcc相关
(1)CentOS7能上外网
(2)yum -y install gcc
(3)yum -y install gcc-c++
4、卸载旧版本
从官网获取卸载命令
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
5、安装需要的软件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
6、设置stable镜像仓库
方法一:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
方法二(推荐):
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
7、更新yum软件包索引
sudo yum makecache fast
8、安装DOCKER CE
yum -y install docker-ce
9、启动docker
systemctl start docker
10、测试
docker version
docker run hello-world
11、配置镜像加速
mkdir -p /etc/docker
vim /etc/docker/daemon.json
网易云:
{"registry-mirrors":["http://hub-mirror.c.163.com"]}
阿里云:
{
"registry-mirrors":["https://{自己的编码}.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
12、卸载
systemctl stop docker
yum -v remove docker-ce
rm -rf /var/lib/docker
docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /home/jenkins-home-docker:/var/jenkins_home -d jenkins
docker run --name myjenkins1 -p 8080:8080 -p 50000:50000 -d jenkins
docker run -u root -p 18084:8080 -p 50000:50000 -d -v /data/jenkins:/var/jenkins_home --name myjenkins jenkins
docker run -d \ --hostname gitlab \ --publish 10443:443 --publish 18085:80 --publish 10022:22 \ --name gitlab \ --restart always \ --volume /data/gitlab/config:/etc/gitlab \ --volume /data/gitlab/logs:/var/log/gitlab \ --volume /data/gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:9.5.0-rc2.ce.0

浙公网安备 33010602011771号