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

posted @ 2019-11-26 22:36  乐未央  阅读(260)  评论(0)    收藏  举报