docker笔记-基础(不带项目)-docker笔记基础知识详细总结

docker笔记基础知识

1.docker概述

docker是通过内核(指linux内核)虚拟化技术(namespace及cgroups等)来提供容器的资源隔离与安全保障等。

由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。在非linux平台无法使用docker,docer是c/s架构

2.常见架构

c/s架构:    client端和server端    

b/s架构:     浏览器端和server端

3.docker组成和组件

docker组成:client端和server端

docker组件: 镜像(image)、容器(container,也叫实例或虚拟机)、仓库(repository)

4.docker和OpenStack的对比:

5.docer的安装:(在centos7下)

[root@localhost ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

[root@localhost ~]# systemctl stop firewalld.service     #关闭防火墙

[root@localhost ~]# systemctl disable firewalld.service  #禁止防火墙开机自启

[root@localhost ~]# getenforce

Enforcing

[root@localhost ~]# setenforce 0     #此处是否关闭selinux和下面报错没关系,尽量关闭吧

[root@localhost ~]# yum -y install docker             #安装docker

[root@localhost ~]# systemctl start docker            #启动docker,下面错误

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

#注意包上面错,是因为此linux的内核中的SELinux不支持 overlay2 graph driver解决方法要么启动一个新内核,要么就在docker里禁用selinux,--selinux-enabled=false

[root@localhost ~]# vi /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs

OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'  #修改

if [ -z "${DOCKER_CERT_PATH}" ]; then

    DOCKER_CERT_PATH=/etc/docker

fi

……

[root@localhost ~]# systemctl start docker           #启动docker成功

[root@localhost ~]# ps -ef |grep docker

root     17892     1  0 13:27 ?        00:00:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled=false --log-driver=journald --signature-verification=false --storage-driver overlay2

root     17897 17892  0 13:27 ?        00:00:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true

root     17997  9842  0 13:28 pts/1    00:00:00 grep --color=auto docker

[root@localhost ~]# systemctl stop docker             #停止docker

[root@localhost ~]# ps -ef |grep docker

root     18006  9842  0 13:29 pts/1    00:00:00 grep --color=auto docker

[root@localhost ~]# docker --version

Docker version 1.13.1, build 774336d/1.13.1

6.docker镜像管理 (搜索、下载、查看、删除镜像(镜像是各系统光盘))

1)docker下载镜像出错并解决:

[root@localhost ~]# docker search redhat           #搜索网络镜像

INDEX       NAME                                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/hjd48/redhat                               redhat6.3x86-64 images                          12                   

docker.io   docker.io/fbascheper/redhat-jboss-eap                Extensible RedHat JBoss EAP                     7                    

docker.io   docker.io/yjjy0921/redhat7.2                         A clean redhat 7.2 image from official red...   5                    

docker.io   docker.io/aossama/redhat                             RHEL 7.0     

………

[root@localhost ~]# docker pull docker.io/yjjy0921/redhat7.2   #下载镜像出错

Using default tag: latest

Trying to pull repository docker.io/yjjy0921/redhat7.2 ...

latest: Pulling from docker.io/yjjy0921/redhat7.2

16dc1f96e3a1: Pulling fs layer

error pulling image configuration: Get https://dseasb33srnrn.cloudfront.net/registry-v2/docker/registry/v2/blobs/sha256/5f/5fbb74308f2db1a6c2fa06e72ede9fdd4ecf34754e8e9280e382b77652b470a3/data?Expires=1522352041&Signature=S1QY3Rsy6t37m2P~ZuSUl05c6ZEIlaUwWdeX~UCdMH-LIalYUyJpfr7ZspdHY4ERKMJLi8~JpFcWupyfAhOfj45uWetQlEjsWnvxJDdp3fPJfULfjRG8Dqte98C1updSD0S8YRqm2EFqhtepwrTVlPEFbn7e7feiauxD5sgQv8Y_&Key-Pair-Id=APKAJECH5M7VWIS5YZ6Q: net/http: TLS handshake timeout

#注意:原因是因为国内网络问题,无法连接到 docker hub。 好在国内已经有daocloud,docker指定该源即可。centos7处理办法如下,其他系统版本处理方法类似,添加后重启docker 即可

解决方法:

[root@localhost ~]# vi /etc/sysconfig/docker

# /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs

OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false --registry-mirror=http://f2d6cb40.m.daocloud.io' #添加该源

if [ -z "${DOCKER_CERT_PATH}" ]; then

    DOCKER_CERT_PATH=/etc/docker

fi

……….

[root@localhost ~]# systemctl  stop docker

[root@localhost ~]# systemctl  start docker

[root@localhost ~]# docker pull docker.io/yjjy0921/redhat7.2   #下载镜像没有问题

[root@localhost ~]# docker images                              #查看下载的镜像,存到本地镜像仓库中

REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE

docker.io/yjjy0921/redhat7.2   latest              5fbb74308f2d        21 months ago       204 MB

2)docker镜像管理

查看本地镜像:

[root@localhost ~]# docker images    #查看本地镜像仓库下所有的镜像(已下载的),每个镜像都有一个唯一ID

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

搜索网络镜像:

[root@localhost ~]# docker search centos                     #搜索所有centos网络镜像

INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/centos                             The official build of CentOS.                   4871      [OK]       

docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              119                  [OK]

docker.io   docker.io/jdeathe/centos-ssh                 CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x...   99                   [OK]

docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   67                   [OK]

docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              47                   [OK]

docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      43                   

……

[root@localhost ~]# docker search -s 40 tomcat             #只搜索列出点赞数超过40的tomcat镜像

Flag --stars has been deprecated, use --filter=stars=3 instead

INDEX       NAME                       DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/tomcat           Apache Tomcat is an open source implementa...   2125      [OK]       

docker.io   docker.io/tomee            Apache TomEE is an all-Apache Java EE cert...   58        [OK]       

docker.io   docker.io/dordoka/tomcat   Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba...   49                   [OK]

[root@localhost ~]# docker search -s 30 --no-trunc --automated tomcat   #搜索点赞数超过30,且镜像信息完整,且AUTOMATED状态是ok的镜像

Flag --stars has been deprecated, use --filter=stars=3 instead

Flag --automated has been deprecated, use --filter=automated=true instead

INDEX       NAME                                 DESCRIPTION                                                                             STARS    OFFICIAL   AUTOMATED

docker.io   docker.io/dordoka/tomcat             Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 based docker container.                                  49                   [OK]

docker.io  docker.io/davidcaste/alpine-tomcat  Apache Tomcat 7/8 using Oracle Java 7/8 with GLIBC 2.21 over Alpine with unlimited JCE patch applied  31                   [OK]

下载网络镜像:

[root@localhost ~]# docker pull centos                       #默认下载第一个镜像,若想下载其他就跟上绝对路径

[root@localhost ~]# docker pull docker.io/ansible/centos7-ansible     #下载指定的镜像,跟路径

[root@localhost ~]# docker pull centos:6.8                            #指定版本下载网络镜像

[root@localhost ~]# docker images           #查看本地镜像仓库下所有的镜像(已下载的),所属仓库、标签、ID、创建时间、大小

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos                    6.8                 e54faac158ff        3 weeks ago         195 MB

docker.io/centos                    latest              75835a67d134        3 weeks ago         200 MB

docker.io/ansible/centos7-ansible   latest              688353a31fde        22 months ago       447 MB

本地查看镜像:

[root@localhost ~]# docker images -a          #列出所有镜像,包括中间镜像层

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos                    6.8                 e54faac158ff        3 weeks ago         195 MB

docker.io/centos                    latest              75835a67d134        3 weeks ago         200 MB

docker.io/ansible/centos7-ansible   latest              688353a31fde        22 months ago       447 MB

[root@localhost ~]# docker images -q              #只显示镜像ID(不包括中间镜像层)

e54faac158ff

75835a67d134

688353a31fde

[root@localhost ~]# docker images -qa             #列出所有的镜像ID,包括中间镜像层

e54faac158ff

75835a67d134

688353a31fde

[root@localhost ~]# docker images --digests       #显示镜像的摘要信息

REPOSITORY                    TAG              DIGEST                                                                    IMAGE ID            CREATED             SIZE

docker.io/centos                6.8            sha256:5b1a8064eb59cfd1e1c48ede6644f0862ddf4aa60d20245abb439961ac8a4573   e54faac158ff        3 weeks ago         195 MB

docker.io/centos                latest         sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b   75835a67d134        3 weeks ago         200 MB

docker.io/ansible/centos7-ansible   latest     sha256:00284f8b7f0fb02bbcc99cf720a512f4c1e26404b59b6ea52fc255bd12d0a7fd   688353a31fde        22 months ago       447 MB

[root@localhost ~]# docker images --no-trunc      #显示完整的镜像信息

REPOSITORY                        TAG                IMAGE ID                                                                  CREATED             SIZE

docker.io/centos                  6.8               sha256:e54faac158ffc33e92a3fe1f59ccc0b8bbe375cf1b672537e2fbd2b7606beeb5   3 weeks ago         195 MB

docker.io/centos                   latest           sha256:75835a67d1341bdc7f4cc4ed9fa1631a7d7b6998e9327272afea342d90c4ab6d   3 weeks ago         200 MB

docker.io/ansible/centos7-ansible   latest          sha256:688353a31fdee02a966d1f83e9210f77b5a63baaaacbedb81ca35f6231cfeb6c   22 months ago       447 MB

本地删除镜像:

[root@localhost ~]# docker rmi e54faac158ff                   #按镜像ID删除单个镜像

[root@localhost ~]# docker rmi e54faac158ff 75835a67d134 ...  #按镜像ID删除多个镜像

[root@localhost ~]# docker rmi docker.io/centos               #按镜像名字删除单个镜像(默认latest)

[root@localhost ~]# docker rmi docker.io/centos:6.8           #按镜像名字删除单个镜像(指定版本)

[root@localhost ~]# docker rmi docker.io/centos:6.8 docker.io/centos   #按镜像名字删除多个镜像

[root@localhost ~]# docker rmi -f $(docker images -qa)                 #按镜像ID删除所有的镜像,包括中间镜像层

3.docker容器管理(下载镜像后通过镜像构建容器,然后运行和管理容器,创建、查看、启动、进入、停止、删除容器)

1)docker根据本地仓库中镜像导出一个镜像到指定位置以备用和根据镜像文件导入到本地仓库一个镜像

[root@localhost ~]# docker search centos               #搜索镜像

[root@localhost ~]# docker pull centos                 #默认下载第一个镜像,也可指定搜索路径下载指定镜像

[root@localhost ~]# docker images                      #查看本地镜像仓库中下载好的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker save docker.io/centos > /opt/centos.tar.gz  #据本地下载好的镜像导出一个镜像文件到指定位置

[root@localhost ~]# ls /opt/

centos.tar.gz

[root@localhost ~]# docker rmi 75835a67d134    #删除本地仓库中的镜像

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

[root@localhost ~]# docker load < /opt/centos.tar.gz    #根据已有镜像文件导入镜像到本地镜像仓库

[root@localhost ~]# docker images                       #查看本地镜像仓库中下载好的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

2)管理容器(根据镜像创建、查看、启动、进入、停止、删除容器)

启动容器有两种启动方式:a)已经有了一个容器,把他起来,b)事先没有容器,我创建一个新容器,然后把他起来

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker ps -a       #查看容器,现在还没有构建启动容器(加-a查看所有容器,不加只查看运行的)

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

创建容器:(简单创建,后面项目是实际工作中的创建)

[root@localhost ~]# docker run --name mydocker -it docker.io/centos /bin/bash #根据镜像创建一个容器并进入容器

--name指定一个容器名字 , -t指定一个尾终端供登录进来, -i让容器标准输入保持打开状态,/bin/bash表示执行命令是在/bin/bash下,(也可不用写/bin/bash,镜像打包时Dockerfile文件最后一行一般有一个命令就是/bin/bash)

[root@1f2bf125c7ae /]# ps aux    #该创建的容器目前只运行了一个进程:/bin/bash

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root         1  0.3  0.1  11824  1888 ?        Ss   03:11   0:00 /bin/bash

root        13  0.0  0.1  51712  1708 ?        R+   03:12   0:00 ps aux

[root@1f2bf125c7ae /]# hostname

1f2bf125c7ae

[root@1f2bf125c7ae /]# exit  #退出容器,此种方式进入的容器,退出容器后,容器也自动终止

[root@localhost ~]# docker ps -a   #查看容器(加-a查看所有容器,不加只查看运行的)

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         About a minute ago   Exited (0) 24 seconds ago                       mydocker

[root@localhost ~]# docker start 1f2bf125c7ae/mydocker  #启动已经存在的容器,docker start 容器ID/容器名

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         3 minutes ago       Up 5 seconds                            mydocker

[root@localhost ~]# docker attach 1f2bf125c7ae  #进入容器方式1,但退出后,容器也停止(不推荐)

[root@1f2bf125c7ae /]# exit

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         4 minutes ago       Exited (0) 2 seconds ago                       mydocker

[root@localhost ~]# docker start 1f2bf125c7ae

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         5 minutes ago       Up 3 seconds                            mydocker

[root@localhost ~]# docker inspect --format "{{.State.Pid}}" 1f2bf125c7ae  #根据容器ID获取启动容器进程的pid

13985

[root@localhost ~]# nsenter -t 13985 -u -i -n -p #进入容器方式2,用nsenter命令通过容器PID进入容器,退出后容器不停止(但也不推荐)

#格式:nsenter -t 启动容器的PID号 -u -i -n -p    #-u用户空间,-i指IPC空间,-n指网络空间,-p指pid的namespace,

[root@localhost ~]# nsenter -t 13985 -u -i -n -p

[root@1f2bf125c7ae ~]# hostname

1f2bf125c7ae

[root@1f2bf125c7ae ~]# exit

[root@localhost ~]# docker ps -a             #这种进入容器的方式,退出后容器不停止

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         8 minutes ago       Up 2 minutes                            mydocker

可以将该命令写成一个进入容器的脚本,供使用:(使用脚本进入已经运行的容器,并退出容器后,容器不停止)

[root@localhost ~]# cat ns.sh 

#!/bin/bash

PID=$(docker inspect --format "{{.State.Pid}}" $1)    #根据容器ID获取启动容器进程的pid,$1接收容器ID号

nsenter -t $PID -u -i -n -p           #进入容器方式2,用nsenter命令通过获得容器的PID进入容器,退出后,容器不停止(推荐)

[root@localhost ~]# chmod +x ns.sh

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

9c1431b52f5b        docker.io/centos    "/bin/bash"         42 minutes ago      Up 17 minutes                           mydocker

[root@localhost ~]# ./ns.sh 1f2bf125c7ae

[root@1f2bf125c7ae ~]# hostname

1f2bf125c7ae

[root@1f2bf125c7ae ~]# exit

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         10 minutes ago      Up 5 minutes                            mydocker

#注意:若没有nsenter命令需要装下面的包 yum -y install util-linux

[root@localhost ~]# docker exec -it 1f2bf125c7aemydocker /bin/bash  #进入容器方式3,退出容器后容器不停止(最推荐)

[root@1f2bf125c7ae /]# hostname

1f2bf125c7ae

[root@1f2bf125c7ae /]# exit

exit

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

1f2bf125c7ae        docker.io/centos    "/bin/bash"         11 minutes ago      Up 6 minutes                            mydocker

查看容器:

#再创建几个容器,供演示查看容器命令:

[root@localhost ~]# docker run -d --name mydocker2 -it docker.io/centos /bin/bash

[root@localhost ~]# docker run -d --name mydocker3 -it docker.io/centos /bin/bash

[root@localhost ~]# docker run -d --name mydocker4 -it docker.io/centos /bin/bash

[root@localhost ~]# docker run -d --name mydocker5 -it docker.io/centos /bin/bash

[root@localhost ~]# docker ps                             #查看正在运行的容器

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

11e7d0011fb9        docker.io/centos    "/bin/bash"         34 seconds ago      Up 34 seconds                           mydocker5

29c7e6e8b2b9        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker4

1e2647191ca1        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker3

9cf8c48efd3b        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker2

1f2bf125c7ae        docker.io/centos    "/bin/bash"         18 minutes ago      Up 13 minutes                           mydocker

[root@localhost ~]# docker ps -a             #查看所有的容器,正运行的和停止的都有

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

11e7d0011fb9        docker.io/centos    "/bin/bash"         34 seconds ago      Up 34 seconds                           mydocker5

29c7e6e8b2b9        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker4

1e2647191ca1        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker3

9cf8c48efd3b        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            mydocker2

1f2bf125c7ae        docker.io/centos    "/bin/bash"         18 minutes ago      Up 13 minutes                           mydocker

[root@localhost ~]# docker ps -q                         #查看正在运行的容器ID(仅ID号)

11e7d0011fb9

29c7e6e8b2b9

1e2647191ca1

9cf8c48efd3b

1f2bf125c7ae

[root@localhost ~]# docker ps -aq                        #查看所有的容器ID(仅ID号)

11e7d0011fb9

29c7e6e8b2b9

1e2647191ca1

9cf8c48efd3b

1f2bf125c7ae

停止容器:

[root@localhost ~]# docker stop 1f2bf125c7ae/mydocker     #根据容器的ID/容器名停止容器(优雅停止)

[root@localhost ~]# docker kill 9cf8c48efd3b/mydocker2    #根据容器的ID/容器名停止容器(强制停止)

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES

11e7d0011fb9        docker.io/centos    "/bin/bash"         14 minutes ago      Up 14 minutes                                     mydocker5

29c7e6e8b2b9        docker.io/centos    "/bin/bash"         16 minutes ago      Up 16 minutes                                     mydocker4

1e2647191ca1        docker.io/centos    "/bin/bash"         16 minutes ago      Up 16 minutes                                     mydocker3

9cf8c48efd3b        docker.io/centos    "/bin/bash"         16 minutes ago      Exited (137) 40 seconds ago                       mydocker2

1f2bf125c7ae        docker.io/centos    "/bin/bash"         32 minutes ago      Exited (137) 7 seconds ago                        mydocker

启动容器:

[root@localhost ~]# docker start 9cf8c48efd3b/mydocker2   #根据容器的ID/容器名启动

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES

11e7d0011fb9        docker.io/centos    "/bin/bash"         14 minutes ago      Up 14 minutes                                     mydocker5

29c7e6e8b2b9        docker.io/centos    "/bin/bash"         16 minutes ago      Up 16 minutes                                     mydocker4

1e2647191ca1        docker.io/centos    "/bin/bash"         16 minutes ago      Up 16 minutes                                     mydocker3

9cf8c48efd3b        docker.io/centos    "/bin/bash"         16 minutes ago      Up 6 seconds                                      mydocker2

1f2bf125c7ae        docker.io/centos    "/bin/bash"         32 minutes ago      Exited (137) 7 seconds ago                        mydocker

删除容器:

[root@localhost ~]# docker rm 1f2bf125c7ae    #根据容器的ID删除容器,(已停止的容器删除方法)

[root@localhost ~]# docker rm -f 1e2647191ca1 #根据容器的ID删除容器,(正运行的容器删除方法,很少这么干

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES

11e7d0011fb9        docker.io/centos    "/bin/bash"         17 minutes ago      Up 17 minutes                                    mydocker5

29c7e6e8b2b9        docker.io/centos    "/bin/bash"         19 minutes ago      Up 19 minutes                                    mydocker4

9cf8c48efd3b        docker.io/centos    "/bin/bash"         19 minutes ago      Exited (137) 3 minutes ago                       mydocker2

[root@localhost ~]# docker rm -f $(docker ps -aq) #根据容器的ID删除所有容器

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

附加:做实验时候可以用,生环境不建议使用

1)创建一个容器并测试后容器停止后就自动再删除该容器:

[root@localhost ~]# docker run --rm docker.io/centos /bin/echo "hello word"

hello word

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

2)杀死所有正在运行的容器

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

4.docker容器网络访问(端口映射)(让容器里面的端口对外,使得外网能访问

端口映射有两种方法:随机端口映射和指定端口映射

方法1:随机端口映射

在机器192.168.14.140上安装docker并构建容器,且做容器随机端口映射:

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker search nginx

INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/nginx                                                  Official build of Nginx.                        10088     [OK]       

docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1441                 [OK]

docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   636                  [OK]

……

[root@localhost ~]# docker pull docker.io/nginx    #下载一个带nginx的镜像

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              dbfc48660aeb        2 weeks ago         109 MB

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker run -d -P docker.io/nginx   #根据带nginx的镜像创建一个容器,自动随机映射端口,-d后台运行不进入容器

a7c0598af3c3cb770fdd210d3b83c52c354595a78757c524c4d0110dbb767156

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES

a7c0598af3c3        docker.io/nginx     "nginx -g 'daemon ..."   21 seconds ago      Up 19 seconds       0.0.0.0:32768->80/tcp   lucid_bartik

#注意:0.0.0.0:32768->80/tcp,表示我用随机分配的端口32768对应自己的80端口

客户端通过容器映射的端口访问容器网站:格式:http://docker机器的IP:容器自动分配的端口(32768)

即:http://192.168.14.140:32768 

方法2:指定端口映射

在机器192.168.14.140上安装docker并构建容器,且做容器随机端口映射:

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker search nginx

INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

docker.io   docker.io/nginx                                                  Official build of Nginx.                        10088     [OK]       

docker.io   docker.io/jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker c...   1441                 [OK]

docker.io   docker.io/richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable ...   636                  [OK]

……

[root@localhost ~]# docker pull docker.io/nginx    #下载一个带nginx的镜像

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              dbfc48660aeb        2 weeks ago         109 MB

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker run -d -p 81:80 docker.io/nginx  #根据带nginx的镜像创建容器,指定映射端口,-d后台运行不进入容器

dbc1ca84bb5ff44e51943b2295bf30747d6c6b06d1439a158d3896cfe5b4ff2a

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES

dbc1ca84bb5f        docker.io/nginx     "nginx -g 'daemon ..."   3 seconds ago       Up 3 seconds        0.0.0.0:81->80/tcp      musing_noether

a7c0598af3c3        docker.io/nginx     "nginx -g 'daemon ..."   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   lucid_bartik

#注意:0.0.0.0:81->80/tcp,表示我用随机指定的端口81对应自己的80端口

客户端通过容器映射的端口访问容器网站:格式:http://docker机器的IP:容器指定分配的端口(81)

即:http://192.168.14.140:81 

5.docker的数据管理(数据卷和数据卷容器,注意:一般构建容器都要加数据对应关系,否则建立的容器是暂时的

说明:类似nfs挂载,容器和物理机器建立一个数据对应目录的关系

1)根据镜像创建一个容器并将物理机的某个目录指定挂载到容器本地的/data目录中(建立数据目录对应关系)

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              dbfc48660aeb        2 weeks ago         109 MB

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ~]#

[root@localhost ~]# docker run --name volume-test1 -it -v /data docker.io/centos  #建容器并建立对应和物理机对应数据目录,/data是容器目录

[root@e5b50fec7fde /]# ls /data/

空  #进入容器中查看/data目录,此时还没有东西.

另开一个窗口:

[root@localhost ~]# docker ps -a     #查看容器

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

e5b50fec7fde        docker.io/centos    "/bin/bash"         38 seconds ago      Up 36 seconds                           volume-test1

[root@localhost ~]# docker inspect e5b50fec7fde  #根据容器ID查看物理机和容器的数据挂载目录对应关系

……………….

        "Mounts": [

            {

                "Type": "volume",

                "Name": "4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b",

                "Source": "/var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data", #物理机数据目录

                "Destination": "/data",                                                                                     #容器中的数据目录

……………….

进入物理数据目录中创建数据:

[root@localhost ~]# cd /var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data

[root@localhost _data]# touch aaa

[root@localhost _data]# ls

aaa

再从进入容器的窗口查看容器中的/data目录,发现有数据,再在容器的/data目录建立数据

[root@e5b50fec7fde /]# ls /data/

aaa

[root@e5b50fec7fde /]# touch  /data/bbb

[root@e5b50fec7fde /]# ls /data/

aaa  bbb

在另一窗口的物理目录中查看数据:

[root@localhost _data]# pwd

/var/lib/docker/volumes/4e9369b2c4902e1c438156731f4d65753fa2b18aa3063611bf1c3d16354e611b/_data

[root@localhost _data]# ls

aaa  bbb

2)根据镜像创建一个容器并手动指定将物理机的某个目录(/opt)挂载到容器本地的/opt目录中(建立数据目录对应关系,推荐)

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              dbfc48660aeb        2 weeks ago         109 MB

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ~]# ls /opt/

a.txt

[root@localhost ~]# docker run --name test -it -v /opt:/opt docker.io/centos  #建容器,并建立和物理机对应的数据目录,物理机目录(src):容器目录(dst)

[root@c3a685be017d /]# ls /opt/

a.txt

[root@c3a685be017d /]# touch /opt/hehe

[root@c3a685be017d /]# ls /opt/

a.txt  hehe

[root@c3a685be017d /]# exit

[root@localhost ~]# ls /opt/

a.txt  hehe

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

c3a685be017d        docker.io/centos    "/bin/bash"         51 seconds ago      Exited (0) 33 seconds ago                       test

[root@localhost ~]# docker inspect c3a685be017d  #根据容器ID查看物理机和容器的数据挂载目录对应关系

…………….

        "Mounts": [

            {

                "Type": "bind",

                "Source": "/opt",        #物理机数据目录

                "Destination": "/opt",  #容器中的数据目录

                "Mode": "",

                "RW": true,

                "Propagation": "rprivate"

            }

…………….

#挂载目录时可以指定权限:(建容器,并建立和物理机对应的数据目录,下面若是ro,那么容器内目录只能读)

格式: docker run --name test -it -v /opt:/opt:rorw docker.io/centos 

3)根据镜像创建一个容器test并手动指定将物理机的某个目录(/opt)挂载到容器本地的/opt目录中(建立数据目录对应关系),且建立一个别的容器test1,也使用该挂载的数据目录. 注意:映射可多个目录映射,目录没有会自建

[root@localhost ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/nginx     latest              dbfc48660aeb        2 weeks ago         109 MB

docker.io/centos    latest              75835a67d134        3 weeks ago         200 MB

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

[root@localhost ~]# ls /opt/

a.txt

[root@localhost ~]# docker run --name test -it -v /opt:/opt docker.io/centos  #建容器,并建立和物理机对应的数据目录,物理机目录(src):容器目录(dst)

[root@39b146f34293 /]# ls /opt/

a.txt

[root@39b146f34293 /]# touch /opt/hehe

[root@39b146f34293 /]# ls /opt/

a.txt  hehe

[root@39b146f34293 /]# exit

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

39b146f34293        docker.io/centos    "/bin/bash"         34 seconds ago      Exited (0) 15 seconds ago                       test

[root@localhost ~]# docker inspect 39b146f34293  #根据容器ID查看物理机和容器的数据挂载目录对应关系

…………….

        "Mounts": [

            {

                "Type": "bind",

                "Source": "/opt",            #物理机数据目录

                "Destination": "/opt",       #容器中的数据目录

                   "Mode": "",

                "RW": true,

                "Propagation": "rprivate"

…………….

再创建一个容器test1,并使用刚才容器test的数据目录,并在新容器test1容器中建立一个数据:

[root@localhost ~]# docker run --name test1 -it --volumes-from test docker.io/centos

[root@86fa3708f65c /]# ls /opt/

a.txt  hehe

[root@86fa3708f65c /]# touch /opt/haha

[root@86fa3708f65c /]# ls /opt/

a.txt  haha  hehe

[root@86fa3708f65c /]# exit

[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

86fa3708f65c        docker.io/centos    "/bin/bash"         35 seconds ago      Exited (0) 15 seconds ago                       test1

39b146f34293        docker.io/centos    "/bin/bash"         3 minutes ago       Exited (0) 3 minutes ago                        test

[root@localhost ~]# ls /opt/                     #在对应的物理机上查看/opt下数据,有数据

a.txt  haha  hehe

[root@localhost ~]# docker start test

test

[root@localhost ~]# docker attach test           #进入原容器test中查看/opt下数据,也有数据

[root@39b146f34293 /]# ls /opt/

a.txt  haha  hehe

[root@39b146f34293 /]# exit

#挂载目录时可以指定权限:(建容器,并建立和物理机对应的数据目录,下面若是ro,那么容器内目录只能读)

格式: docker run --name test -it -v /opt:/opt:rorw docker.io/centos 

基础知识补充:

1)以守护进程运行容器:         docker run -d 容器ID/容器名

2)查看容器日志:              docker logs -f -t --tail 容器ID

3)查看容器内部细节:          docker inspect 容器ID

4)不进入容器,执行容器内的命令,结果返回给宿主机:

docker exec -it 容器ID 要执行的命令 #或 docker exec -t 容器ID 要执行的命令

如:docker exec -it 容器ID ls /tmp

5)从容器内拷贝文件到宿主机:  docker cp 容器ID:容器内绝对路径 宿主机绝对路径

6)从宿主机拷贝文件到容器内:  docker cp 宿主机绝对路径 容器ID:容器内绝对路径

7)提交容器副本使之成为一个新的镜像:

docker commit -m=”提交的描述信息” -a=”作者” 容器ID 要创建的目标镜像名:[标签名/版本号]

8)Dockerfile文件的概念和基础介绍:

Dockerfile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本。

特点:

1)每条保留字指令都必须为大写字母且后面要跟随至少一个参数。

2)指令按照从上到下,顺序执行。

3)#表示注释

4)每条指令都会创建一个新的镜像层,并对镜像进行提交。

Dockfile文件的保留字概念:(关键主要的介绍-也几乎全部了)

FROM       #基础镜像,当前新镜像是基于哪个镜像的

MAINTAINER  #镜像维护者信息(姓名和邮箱地址)

RUN         #容器构建时需要运行的命令

EXPOSE      #当前容器对外暴露出的端口

WORKDIR    #指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

ENV         #用来在构建镜像过程中设置环境变量

ADD         #将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理url和解压tar压缩包(拷贝加解压缩)

COPY        #类似ADD,拷贝文件和目录到镜像中(仅拷贝)

VOLUME     #容器数据卷,用于数据保存和持久化工作

CMD    #指定一个容器启动时要运行的命令,dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTRYPOINT  #指定一个容器启动时要运行的命令,目的和CMD一样,都是在指定容器启动程序及参数(追加)

ONBUILD     #当构建一个被继承的dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

Dockerfile文件映射容器卷和宿主机目录映射:

上面等同于下面:

附加:

9)使用dockerfile文件构建镜像时候使用方法:

# docker build -f /root/Dockerfile2 -t mycentos:v1 .  #-f指定dockerfile文件名

注意:上述的,如果dockerfile名字是:Dockerfile也可省略指定配置文件名,直接用: docker build -t mycentos:v2 .

10)Dockerfile文件中ENTRYPOINT和CMD解析:

1)ENTRYPOINT

#cat Dockerfile

.......

ENTRYPOINT ["curl","-s","http://ip.cn"] #下面最后run容器最后添加-i后相当于:ENTRYPOINT ["curl","-s","-i","http://ip.cn"]

# docker run -it Dockerfile文件形成的镜像:标签号 -i        #能执行,不报错

2)CMD

#cat Dockerfile

.......

CMD ["curl","-s","http://ip.cn"] #下面最后run容器最后添加-i后相当于在改行下面添加了一行:CMD ["-i"],则改行被覆盖,只执行添加的,会报错

# docker run -it Dockerfile文件形成的镜像:标签号 -i       #会报错

#注意:上面都包括有:(如果出现如下报错,解决方法如下:)

报错:  [Warning] IPv4 forwarding is disabled. Networking will not work.

解决:# vim /etc/sysctl.conf

net.ipv4.ip_forward=1   #添加

重启network服务: systemctl restart network

如果对运维课程感兴趣,可以在b站上搜索我的账号: 运维实战课程,可以关注我,学习更多运维实战技术视频!

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维实战课程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值