一 docker基础命令

docker run hello-world

run : 包含两个步骤

① 下载镜像 pull  dockerhub 仓库中 项目/库/镜像

② 开启容器 start hello-world-image

工作流程:

docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)通过restful api连接,典型的C/S架构

由docker 服务端的守护进程从docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)

服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用(client)

docker 服务端把这些信息流(传递)返回到客户端并展示出来,(展示在终端上)

docker client 可以是多种形式,比如"docker"命令工具所在的终端

 

1,镜像基本操作命令

#查询docker 版本     docker version  && docker info

#镜像搜索       docker search 关键字(nginx)     默认从Docker Hub 中搜索镜像

#镜像下载        docker pull 关键字(nginx)       不带标签的话默认最新版本latest

#镜像查询            docker images  (docker image ls )

#查看镜像详细信息    docker inspect 镜像ID或者 镜像:标签

docker images --no-trunc            查看详细id号

#添加镜像标签        docker tag 镜像标签 新标签

docker tag nginx:latest nginx:web

#删除镜像           docker rmi 镜像标签(nginx:latest) 或者iD

                     不带标签默认的是latest  正在运行的删不掉

                     -f 为强制删除  docker rmi -f `docker images -q`强制删除全部镜像

#镜像输出           docker save -o nginx_img nginx:latest  保存到当前目录

                    docker save centos:7 > /opt/centos_new  保存到指定目录

#镜像导入           docker load <镜像文件(nginx_img)

                    Docker image load -i /opt/centos:7

把之前下载好的镜像通过 docker load -i 解压出来:

把 centos.tar.gz、nginx.tar.gz 镜像包上传到机器的 root 目录,

通过 docker load - i 解压镜像

[root@xuegod63 ~]# docker load -i /root/nginx.tar.gz

[root@xuegod63 ~]# docker load -i /root/centos.tar.gz

通常会结合ftp   winscp  ssh 登陆VPN 等使用

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_02

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_03

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_04

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_05

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_06

对没有标签的添加标签(REPOSITORY和TAG)

docker image tag 镜像ID 镜像名:版本号

可自定义镜像名和版本号

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_07

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_08

注:docker 镜像相当于对操作系统+程序+程序依赖的库打一个包

软件是依赖操作系统中的库或二进制文件。 如果我把软件所依赖的库和二进制文件打包在一起发布,不用物理机系统上的文件,也就不依赖操作系统了。

 

面试技能点

PS Linux 发行版:alpine centos redhat Debian(apt包管理,centos 是rpm) 生产环境可能会用的

 

2、容器的管理

 一般分为两种容器种类:交互式和守护式容器

交互式容器:一般用于测试、开发、临时性任务等

守护式容器:一般用来跑服务

 

容器基本操作命令

#容器列表查询(包含所有)          docker ps -a 或docker container ls -a    

#查看运行中的容器               docker container ls                  

CONTAINER ID :运行中容器的唯一号码(自动生成)

NAMES :容器的名字(默认自动生成,可手工指定,不可重复)

        手工指定:在开启容器时指定 docker container run -it --name="ljm" 9f266d35e02c

IMAGE :镜像的ID

STATUS :运行状态 (up为运行中,exited为关闭掉的容器。可使用 docker ps -a (docker container ls -a) 查看所有状态)

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_09

#面试题:

容器状态有哪些,分别是什么场景?

容器状态有7种:

created(已创建)

restarting(重启中)

up/running(运行中)

removing(迁移中)

paused(暂停)

exited(停止)

dead(死亡)

 

 

#创建容器                   docker create -it nginx:latest /bin/bash

-i 让容器的标准输入保持打开

-t 分配一个伪终端

-d 后台守护进程的方式运行

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_10

#启动/停止/重启容器                  docker start/stop/restart 容器ID

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_11

#一次性容器操作

docker run 镜像名称 操作指令

docker run centos:7 /usr/bin/bash -c ls /

 

#持续后台运行

docker run -d centos:7 /bin/bash -c "while true;do echo hello;done"

 

#进入容器

① 使用run      docker run -it nginx:latest /bin/bash

② exec(容器必须为开启状态)    docker exec -it 容器ID /bin/bash

 

exec 和shell 是两种运行模式

PS:

docker run -it 会创建前台进程,但是会在输入exit后终止进程。

docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止容器进程.

docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。

 

#容器导入

docker import 导入的容器名 指定镜像名

示例:

docker import nginx_a nginx:latest

cat 文件名(容器) | docker import - nginx:latest

 

#容器导出

docker export 容器ID > 导出的容器名

示例:

docker export 容器ID > nginx_a

 

批量删除容器&&批量删除镜像

 

#删除容器

docker rm 容器ID

#强制删除容器(正在运行的)

docker rm -f 容器ID

 

#删除非up状态的    rm -f : 强制删除所有

docker rm `docker ps -q`

 

#批量删除“exit”状态(指定状态)的容器

for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done

 

#容器打包为镜像

docker run -it --name Nginx.01 nginx:latest /bin/bash 先运行

docker commit 39eaa5aa7332 nginx-v1beta

 

docker inspect 容器ID 查看容器内部细节

 

新建并启动容器

docker run [OPTIONS] IMAGE [COMMAND]

OPTIONS说明(常用):有些是一个减号,有些是两个减号

--name="容器新名字": 为容器指定一个名称;如果不写,docker会给默认指定的名字

-d: 后台运行容器,并返回容器ID,也即启动守护式容器;

-i:以交互模式运行容器,通常与 -t 同时使用;

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;

-P: 随机端口映射;

-p: 指定端口映射,有以下四种格式

      ip:hostPort:containerPort

       ip::containerPort

      hostPort:containerPort

      containerPort

使用镜像redis:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。docker run -it redis /bin/bash

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_12

启动守护式容器(容器后台运行):docker run -d tomcat

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_13

关于守护式容器注意:Docker容器后台运行就必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(如:top,tail),容器会自动退出。

Docker run hello-world 都干了啥

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_14

4) 进入正在运行的容器

① 使用run

docker run -it nginx:latest /bin/bash

② exec(容器必须为开启状态)

docker exec -it 容器ID /bin/bashexec: 进入正在运行的容器,并以命令行交互docker exec -it 容器ID bashshell

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_15

attach 重新进入正在运行的容器

run,attach, exec的区别:

docker run 创建和启动一个新的容器实例,操作对象是镜像,选项较多,如果你要创建和启动一个容器,只能用run;

docker exec 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;

docker attach 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;

 

5) 其他命令

docker container ls 列出本机正在运行的容器 同docker ps

docker container ls --all  列出本机所有容器,包括终止运行的容器

docker ps 列出当前所有正在运行的容器

-a :列出当前所有正在运行的容器+历史上运行过的

-l :显示最近创建的容器

-n:显示最近n个创建的容器

-q :静默模式,只显示容器编号

--no-trunc :不截断输出

exit 容器停止退出

ctrl+P+Q 容器不停止退出

docker attach 进入后台运行的容器

docker kill 强制停止容器

docker rm 删除已停止的容器 (-f强制删除)

一次删除多个容器:docker rm -f ${docker ps -a -q} 或docker ps -a -q | xargs docker rm

docker inspect 容器ID 查看容器内部细节

docker cp 容器ID:容器内路径 目的主机路径  从容器内拷贝文件到主机上

docker logs -tf --tail 10 4d2ba08f5929查看容器的日志

-t 是加入时间戳

-f 跟随最新的日志打印

--tail 数字 显示最后多少条

docker top 容器ID 查看容器内运行的进程

 

二 docker网络模式

1、基本概念

docker0网络:docker容器的虚拟网关,绑定物理网卡,负责做NAT 地址转换、端口映射。本身也是一种容器

loopback :回环网卡、TCP/IP网卡是否生效

virtual bridge:linux 自身继承了一个虚拟化功能(kvm架构),是原生架构的一个虚拟化平台,安装了一个虚拟化平台之后就会系统就会自动安装虚拟网卡,(示例:安装workstation (虚拟化平台)之后,会在网络适配器中会多出VMnet1 VMnet8 VMnet0)

 

2、docker 网络模式docker network ls

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_16

host模式 –net=host 容器和宿主机共享Network namespace。

container模式 –net=container:NAME_or_ID

多个容器共享一个Network namespace。

none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。

bridge模式     –net=bridge (默认为该模式)

 

以上不需要动手配置,真正需要配置的是自定义网络

 

host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_17

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_18

none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_19

bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_20

3、docker自定义网络

#查看网络列表

docker network ls

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_21

#查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)

docker inspect 容器ID

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_22

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_23

#自定义网络固定IP

docker network create --subnet=172.18.0.0/16 mynetwork

docker run -itd --name test2 --net mynetwork --ip 172.18.0.100 centos:latest /bin/bash

 

4、暴露端口

-p 自定义端口 ( 宿主机端口:容器内端口)

-P 随机端口   (-P 49153起始  49153到65535)

docker run -itd -p 333:80 nginx /bin/bash (docker 0)

docker run -itd -P nginx /bin/bash

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_24

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_25

#在宿主机环境执行容器内命令

docker exec -it 容器ID /bin/bash -c 'nginx'

docker exec 容器ID/容器name 执行的命令

应用场景:如制作的镜像是没有开启,需要启动容器后执行启动命令

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_26

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_27

面试题

怎么把宿主机的文件传入到容器内部

docker cp /opt/abc 容器id:/opt/abc

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_28

#进入容器没有systemctl 命令解决:添加--privileged=true (指定此容器是否为特权容器),使用此参数,则不能用attach

示例:

docker run -itd --name test3 --privileged=true centos /sbin/init

/sbin/init 内核启动时主动呼叫的第一个进程

可以使用docker inspect 容器ID

docker ps -a

docker exec -it 容器id /bin/bash

yum install httpd -y

systemctl status httpd

 

 

三、Docker 数据卷

宿主机目录/var/www 挂载容器中的/data1

docker run  -v /var/www:/data1 --name web1 -it centos /bin/bash

[root@202dd484fd62 /]# cd /data1/

[root@202dd484fd62 data1]# touch test123

//返回宿主机进行查看

[root@localhost ~]# ls /var/www/

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_bash_29

应用场景:

原理:将容器内部的配置文件目录,挂载到宿主机指定目录下

作用:

① 修改配置文件例如,nginx.conf

 /usr/local/nginx/conf/nginx.conf ---> /container_nginx/conf/nginx.conf

② 容器内部产生的日志,如何收集 将容器内部存放日志文件的目录挂载到宿主机指定目录下/container_nginx/log/access_log /access_log

③ 传入变量 挂载到宿主机 在宿主机上添加变量内容,将变量放入共享目录,在容器中/etc/profile 直接加载就可以

export xxdir=/data/data1/xx.

 

 

 

四、数据卷容器

//数据卷容器

docker run --name web100 -v /data1 -v /data2 -it centos /bin/bash

/data1 和/data2目录会自动创建

 

//新容器挂载数据卷容器web100

docker run -it --volumes-from web100 --name db1 centos /bin/bash

原理:让两个容器实现数据共享

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_30

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_docker_31

docker 基础命令及网络模式,数据卷 数据卷容器 端口暴露_nginx_32

容器互联(使用centos镜像)

示例:

docker run -itd -P --name web1 centos /bin/bash //创建并运行容器取名web1,端口号自动映射

docker run -itd -P --name web2 --link web1的ID:web1 centos /bin/bash //创建并运行容器取名web2,链接到web1和其通信

进web2 容器  ping web1

 

应用场景:哨兵 ——》监控 redis

哨兵和redis包括哨兵和哨兵之间相互监控,会使用ping命令