shell docker的介绍和使用

概念:

- image:镜像,用于启动一个容器
- container:容器
- network:网络
- volumes:卷,用来持久存储
- plugin:插件

什么是docker?

- docker就是用来管理容器的工具

什么是容器?

- 容器就是一个独立的程序运行环境

docker用在什么场景?

- 提升开发效率
- 简化开发难度
- 实现服务隔离
- 实现快速部署

版本:

- CE:社区版
- EE:商业版本

系统条件

- 64位的CPU
- 内核版本3.10及以上
- 内核支持cggroups 和 namespace

安装docker

- 第一步:上传docker的rpm包到Linux
- 第二步:进行安装

    [root@master ~]# yum localinstall docker-ce-18.06.3.ce-3.el7.x86_64.rpm 

创建docker配置文件

    [root@master ~]# mkdir /etc/docker
    [root@master ~]# vim /etc/docker/daemon.json
    {
    
    
      "registry-mirrors": ["https://mzxx8xy8.mirror.aliyuncs.com"]
    }

启动docker

    [root@master ~]# systemctl start docker
    [root@master ~]# docker info

镜像:

- 其实就是一个模板
- 通过镜像可以快速启动一个服务
- 比如,通过nginx镜像,就可以快速启动一个nginx服务

使用docker

- 拉取镜像
- 检查镜像
- 启动容器
- 







简单使用docker

1)拉取nginx镜像文件

    [root@master ~]# docker search nginx
    [root@master ~]# docker pull nginx

2)拉取centos镜像文件

3)拉取busybox镜像

    [root@master ~]# docker pull busybox

3)查看镜像

    [root@master ~]# docker image ls
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    nginx               latest              6678c7c2e56c        3 weeks ago         127MB

启动容器的命令格式:

- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

启动busybox容器

    [root@master ~]# docker run --name mybox1 -it busybox

- -it:进入容器

在容器中,启动一个web服务

    # mkdir /data/html
    # echo "test page">/data/html/index.html
    # httpd -f -h /data/html

在宿主机中执行ps,查看进容器

    [root@master ~]# docker ps

- docker ps 仅仅可以查看正在运行的容器,已经停止的容器看不到
- docker ps -a可以查看全部的容器
- 一旦退出容器,容器会变成停止状态

查看容器的ip信息

    [root@master ~]# docker inspect mybox | grep "Address"

通过ip访问容器的apache测试页

    [root@master ~]# curl x.x.x.x

docker使用

- 管理镜像
- 管理容器
- 管理存储
- 管理网络

管理镜像:

- build :基于dockerfile制作镜像
- inspect:显示镜像的详细信息
- load:从压缩包中导入镜像
- save:将当前的某个镜像导出制作成压缩包
- ls:查看当前本地有哪些镜像
- pull:从镜像仓库拉取镜像到本地
- push:将一个本地镜像推送到镜像仓库
- rm:删除镜像
- tag :给镜像打标签
- prune:删除所有未使用的镜像

关于镜像仓库

- 专门用来存储docker镜像的服务器,称之为镜像仓库
- 网络上有很多镜像仓库

操作1:查看本地有哪些镜像

    [root@master ~]# docker image ls
    [root@master ~]# docker images

操作2:搜索镜像【比如搜索全部的nginx镜像】

    [root@master ~]# docker search nginx

操作3:拉取镜像【拉取nginx:1.17.7-alpine】

    [root@master ~]# docker image pull nginx:1.17.7-alpine

操作4:向docker仓库推送镜像

    [root@master ~]# docker image push xxxxx

操作5:删除镜像

    [root@master ~]# docker image rm -f nginx:2.0
    [root@master ~]# docker rmi -f 470

操作6:查看镜像的详细信息

    [root@master ~]# docker image inspect 82c

操作7:导出镜像操作【将nginx1.17.7-alpine导出】

    [root@master ~]# docker image save 36189e6707f4>ngx.tar.gz

操作8:导入镜像【删除原有镜像,然后导入镜像】

    [root@master ~]# docker load -i ngx.tar.gz 

操作9:给镜像打标签【名称设置为nginx,tag设置为1.17.7-alpine】

    [root@master ~]# docker image tag 361 nginx:1.17.7-alpine

操作10:将一个正在运行的容器制作成镜像

例子:先安装一个centos容器,在这容器中安装nginx,修改配置文件,然后将这个做了修改的容器制作成镜像

    [root@master ~]# docker commit  mycon1 nginx-temp:v0.1

容器的管理

docker container的子命令

- cp:在宿主机和容器中互相发送
- run:启动一个容器
- inspect:显示容器的详细信息
- pause:挂起容器
- unpause:将挂起的容器继续运行
- stop:关闭容器
- start:将关闭的容器重新运行
- prune:删除所有已经停止的容器
- rm:删除指定的容器
- rename:修改容器的名称
- stats:动态显示容器的资源使用情况
- ls:显示容器
- logs:查看容器中的日志信息
- exec:登录一个指定的容器

docker的子命令

- kill:杀死容器
- ps:查看容器
- rm:删除容器
- run:运行容器

操作1:运行一个nginx容器

格式:docker  run  [选项]  镜像名  [命令]

选项:

- -d:让容器工作在后台
- -i:以交互防护启动容器
- -t:给用户绑定一个终端
- --name:给容器设置名称
- --rm:容器停止后自动删除容器

例子:启动一个nginx,让nginx工作在前台

    [root@master ~]# docker container run --name my1 nginx:1.17.9

例子:启动一个nginx,让nginx工作在前台,并且给用户绑定一个交互窗口

    [root@master ~]# docker run --name my2 -it nginx:1.17.9 /bin/bash

例子:启动一个nginx,让nginx工作在后台

    [root@master ~]# docker container run --name my1 -d nginx:1.17.9

操作2:登录已经启动的容器

例子:启动一个nginx容器工作在后台,然后登录这个容器

    [root@master ~]# docker run --name mycentos2 --rm -d centos:7 /usr/sbin/init
    [root@master ~]# docker exec -it mycentos2 /bin/bash

操作3:查看容器【已经停止的容器/正在运行的容器】

格式:docker  ps  [选项]

选项:

- -a:显示全部的容器,包括已经的容器
- -q:仅仅显示容器的ID

案例1 :显示所有容器的id

    [root@master ~]# docker ps -q -a

案例2:仅仅显示正在运行的容器的ID

    [root@master ~]# docker ps -q
    c820c3ca2a1a
    fe789a579425
    eba7ee871cd2
    b71e6fbad30b

操作3:杀死容器

案例:杀死myos2这个容器

    [root@master ~]# docker kill myos2

案例:杀死全部正在运行的容器

    [root@master ~]# docker kill $(docker ps -q)

操作4:删除容器【正在运行的容器/已经停止的容器】

案例:删除已经停止的容器myos2

    [root@master ~]# docker rm myos2

案例:删除正在运行的容器myos3

    [root@master ~]# docker rm -f myos3

案例:删除全部的容器,包括停止和运行的

    [root@master ~]# docker rm -f $(docker ps -a -q)

docker网络

    [root@master ~]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    964b5dd9df18        bridge              bridge              local
    2a6ad00f07cc        host                host                local
    319913a95126        none                null                local

- bridge:桥接网络,基于docker0实现
- none:无网络,外部用户无法访问
- host:让容器和宿主机使用相同的地址



案例:创建一个无网络模式的容器

    [root@master ~]# docker run --name mybx2 -it --rm \
    > --network none --hostname mybx2 \
    > --dns 8.8.8.8 \
    > --dns-search baidu.com \
    > --add-host www.qq.com:1.1.1.1 \
    > busybox
    / # ifconfig
    lo        Link encap:Local Loopback  
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    
    / # hostname
    mybx2
    
    / # cat /etc/resolv.conf 
    search linux.io
    nameserver 8.8.8.8



暴露容器端口到网络

- 不做作暴露:从docker主机外部无法访问容器,仅仅可以docker主机上访问
- 暴露到特定端口:将容器的端口映射到docker主机的一个指定端口,可以完成从外部访问容器
- 暴露到随机端口:将容器的端口映射到docker主机的一个随机端口,可以完成从外部访问容器

不做作暴露

    [root@master ~]# docker run --name myngx1 -d --rm nginx——+
    [root@master ~]# docker inspect myngx1 | grep IPAddress
                "SecondaryIPAddresses": null,
                "IPAddress": "172.17.0.3",
                        "IPAddress": "172.17.0.3",
    [root@master ~]# curl 172.17.0.3

- 此时,在外部通过浏览器无法访问web

暴露到特定端口

    [root@master ~]# docker run --name myngx2 -p 8903:80 -d --rm nginx 

- 外部用户访问的时候,访问的是宿主机的8903端口

暴露到随机端口

    [root@master ~]# docker run --name myngx3 -p 80 -d --rm nginx 
    [root@master ~]# docker ps 
    通过ps可以看到将docker的端口暴露到那个宿主机端口

- 此时外部用户通过这个随机端口可以访问容器



联盟式网络

需要 创建两个容器,第二个容器使用第一个容器的地址

    [root@master ~]# docker run --name c1 --rm -it --network centos:7 /bin/bash
    [root@master ~]# docker run --name c2 --rm -it --network container:c1 centos:7 /bin/bash



修改docke容器的网络

- 默认情况下,所有容器的ip都是由docker0分配的地址
- 修改docker0的地址,就可以实现修改创建容器的网段

案例:修改docker配置文件,默认用10.0.0作为容器IP

    [root@master ~]# cat /etc/docker/daemon.json 
    {
    
    
       "registry-mirrors": ["https://mzxx8xy8.mirror.aliyuncs.com"],
       "bip": "10.0.0.1/8",
       "default-gateway": "10.0.0.100",
       "dns": ["8.8.8.8"]
    }
    [root@master ~]# systemctl daemon-reload
    [root@master ~]# systemctl restart docker

docker重点知识:

- 如何做端口映射:-p  宿主机端口:容器端口
- 如何指定容器的网络类型:--network  host|bridge
- 链模式网络如何使用:--network  contariner:容器名

docker 存储-volume

- 启动容器时候,会挂在镜像
- 在容器中执行写入操作,会对镜像进行复制【写时复制】,然后在复制的镜像中进行存储
- 关闭容器的时候,会卸载原有镜像,而且复制的镜像会被删除
- 因此,默认情况下,关闭容器后,容器中全部数据都会被删除

docker volume是用于解决docker容器数据的持久存储问题

docker  volume两种类型

- docker mount volume:
- docker managed volume:docker自动将一个宿主机目录挂载到容器指定目录

docker使用volume的方法1:-v  容器的目录

案例1:将宿主机目录挂载到容器的/data/html目录下

    [root@master ~]# docker run --name centos1 -it --rm -v /data/html centos:7 /bin/bash

- 默认去宿主机/var/lib/docker/volumes/6xxxxx/_data挂载到容器的/data/html下

docker使用volume的方法2:-v  宿主机上的目录:容器上的目录

案例2:将宿主机的/www挂载到容得/data/html目录下

    [root@master ~]# docker run --name centos2 -it --rm \
    > -v /www:/data/html \
    > centos:7 /bin/bash

案例3:先创建一个容器,然后再创建一个容器,要求两个容器的挂载是使用相同的宿主机目录;而且两个容器的ip相同

    [root@master ~]# docker run --name centos1 -it --rm -v /www:/data/html centos:7 /bin/bash

    [root@master ~]# docker run --name centos2 --rm -it --volumes-from centos1 --network container:centos1 centos:7 /bin/bash

dockerfile

1. 什么是dockerfile

背景

- 基于centos做个镜像,镜像需要安装nginx、需要准备配置文件、需要准备测试页面....
- 而且需要经常做镜像
- 镜像需要分为很多版本:

dockerfile就是一个脚本文件,通过dockerfile文件,可以自动、按需制作镜像



制作镜像的方式:

1)commit:将一个现有容器制作成镜像

- 拉取centos镜像 -> centos容器 -> 安装程序 -> commit -> 将容器和容器中的程序打包制作成镜像

2)save:将一个本地镜像导出成一个tar文件,这个tar文件在其他主机导入以后,就行镜像了

3)dockerfile



dockerfile注意事项

1)Dockerfile文件名D大写

2)#表示注释

3)文件的第一行必须FROM指令

4)dockerfile中的指令通常是写成大写字母,但是大小写不敏感



2 dockerfile指令

1)FROM:指定基础镜像

- 基础镜像可以在本地,也可以在网络
- 优先找本地的镜像

2)LABEL:设置镜像的元数据

3)COPY:将宿主机上的文件复制到目标镜像文件中

案例:基于centos7做个镜像,在这个镜像中准备一个html文件

第一步:首先创建一个Dockerfile文件

    [root@master ~]# cat Dockerfile 
    FROM centos:7
    LABEL author=237745635@qq.com \
          date=20200330
    COPY index.html /data/html/

第二步:准备要放入容器的index.html

- 宿主机上,用于copy的文件,必须在Dockerfile同级目录或子目录下,不能在Dockerfile父目录

    [root@master ~]# echo "test page">index.html 
    [root@master ~]# ls
    Dockerfile  index.html

第三步:制作镜像

    [root@master ~]# docker build -t img1 .
    [root@master ~]# docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    img1                latest              4dd700f2e276        4 minutes ago       203 MB

第四步:基于新镜像启动容器

- 在这个容器中,可以看到在制作镜像时候放进去的文件

4)ADD:也是将一个文件放到镜像中,ADD支持url

- ADD的的文件如果是本地压缩包,则会解压,然后放到容器中
- ADD的文件是一个网络文件压缩包,则是放到镜像中,但是不解压

    FROM centos:7
    LABEL author=237745635@qq.com \
          date=20200330
    COPY index.html /data/html/
    ADD nginx-1.17.9.tar.gz /tmp/

5)WORKDIR:类似执行cd命令

6)volume:用来指定挂载点目录

7)EXPOSE:暴露端口让用户可以访问

8)RUN:指定要执行的命令

9)CMD:指定docker运行之后,默认运行的程序,也就是ID为1的程序

- CMD 命令
- CMD ["命令",“参数”, "参数"...]   <<<<<推荐
- CMD [“参数”, "参数"...]

案例:启动容器自动运行nginx为主进程

    FROM centos:7
    RUN yum install gcc gcc-c++ make pcre-devel zlib-devel ncurses-devel -y
    ADD http://nginx.org/download/nginx-1.16.1.tar.gz /tmp/
    RUN cd /tmp && tar xf nginx-1.16.1.tar.gz
    WORKDIR /tmp/nginx-1.16.1
    RUN ./configure --prefix=/usr/local/nginx 
    RUN make && make install
    RUN echo 'daemon off;'>>/usr/local/nginx/conf/nginx.conf
    COPY index.html /usr/local/nginx/html/
    CMD ["/bin/sh", "-c", "/usr/local/nginx/sbin/nginx"]

- 定义在CMD中的命令,在启动容器的时候,可以进行命令替换

10)ENTRYPOINT:设置容器运行起来以后要执行的命令,而且这个命令是不可以被替换,仅仅可以在这个命令后追加

    FROM centos:7
    RUN yum install gcc gcc-c++ make pcre-devel zlib-devel ncurses-devel -y
    ADD http://nginx.org/download/nginx-1.16.1.tar.gz /tmp/
    RUN cd /tmp && tar xf nginx-1.16.1.tar.gz
    WORKDIR /tmp/nginx-1.16.1
    RUN ./configure --prefix=/usr/local/nginx
    RUN make && make install
    RUN echo 'daemon off;'>>/usr/local/nginx/conf/nginx.conf
    COPY index.html /usr/local/nginx/html/
    CMD ["/usr/local/nginx/sbin/nginx"]
    ENTRYPOINT ["/bin/sh","-c"]

11)ENV:设置变量

    ENV NGX_VER="1.16.1" \
        NGX_ROOT="/usr/local/nginx/"

docker容器的主进程

- 容器运行起来以后,ID为1的进程
- 主进程必须工作在前台
- 主进程一旦结束,docker容器自动结束

猜你喜欢

转载自blog.csdn.net/lq_hello/article/details/106078087