# Docker简介

Docker是开源的应用容器引擎,让开发者可以打包应用到一个可移植的镜像中,然后发布到linux或者windows机器上,使用 Docker可以方便打包,测试及应用部署

# docker和虚拟机

docker 虚拟机
相同点 1. 都可在不同的主机之间迁移
2. 都具备 root 权限
3. 都可以远程控制
4. 都有备份、回滚操作
操作系统 在性能上有优势,可以轻易的运行多个操作系统 可以安装任何系统,但是性能不及容器
原理 和宿主机共享内核,所有容器运行在容器引擎之上,容器并非一个完整的操作系统,所有容器共享操作系统,在进程级进行隔离 每一个虚拟机都建立在虚拟的硬件之上,提供指令级的虚拟,具备一个完整的操作系统
优点 高效、集中。一个硬件节点可以运行数以百计的的容器,非常节省资源,QoS 会尽量满足,但不保证一定满足。内核由提供者升级,服务由服务提供者管理 对操作系统具有绝对权限,对系统版本和系统升级具有完全的管理权限。具有一整套的的资源:CPU、RAM 和磁盘。QoS 是有保证的,每一个虚拟机就像一个真实的物理机一样,可以实现不同的操作系统运行在同一物理节点上。
资源管理 弹性资源分配:资源可以在没有关闭容器的情况下添加,数据卷也无需重新分配大小 虚拟机需要重启,虚拟机里边的操作系统需要处理新加入的资源,如磁盘等,都需要重新分区。
远程管理 根据操作系统的不同,可以通过 shell 或者远程桌面进行 远程控制由虚拟化平台提供,可以在虚拟机启动之前连接
缺点 对内核没有控制权限,只有容器的提供者具备升级权限。只有一个内核运行在物理节点上,几乎不能实现不同的操作系统混合。容器提供者一般仅提供少数的几个操作系统 每一台虚拟机都具有更大的负载,耗费更多的资源,用户需要全权维护和管理。一台物理机上能够运行的虚拟机非常有限
配置 快速,基本上是一键配置 配置时间长
启动时间 秒级 分钟级
硬盘使用 MB GB
性能 接近原生态 弱于原生态
系统支持数量 单机支持上千个 一般不多于几十个

# Docker应用场景

  1. 加速本地开发
  2. 自动打包和部署应用
  3. 创建轻量,私有的Paas环境
  4. 自动化测试和持续集成/部署
  5. 部署并扩展Web应用,数据库和后端服务器
  6. 创建安全沙盒
  7. 轻量级的桌面虚拟化

# Docker核心组件

  • 镜像 镜像是一个只读的静态模板,保存了容器需要的环境和应用的执行代码
  • 容器 容器是一个运行时环境,是镜像的一个运行状态,是镜像执行的动态表现
  • 库 库是用户存储镜像的目录,一个用户可以建立多个库保存自己的镜像

# Docker环境安装

  • 安装yum-utils
yum install -y yum-utils device-mapper-persistent-data lvm2
  • 为yum源添加docker仓库位置
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker
yum install docker-ce
  • 启动docker
systemctl start docker

# Docker常用命令

# 搜索镜像

docker search java 
[root@localhost ~]# docker search java
NAME                                     DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
node                                     Node.js is a JavaScript-based platform for s…   8986                [OK]                
tomcat                                   Apache Tomcat is an open source implementati…   2770                [OK]                
openjdk                                  OpenJDK is an open-source implementation of …   2321                [OK]                
java                                     Java is a concurrent, class-based, and objec…   1976                [OK]                
ghost                                    Ghost is a free and open source blogging pla…   1204                [OK]                
couchdb                                  CouchDB is a database that uses JSON for doc…   352                 [OK]                
jetty                                    Jetty provides a Web server and javax.servle…   337                 [OK]                
groovy                                   Apache Groovy is a multi-faceted language fo…   97                  [OK]                
lwieske/java-8                           Oracle Java 8 Container - Full + Slim - Base…   46                                      [OK]
nimmis/java-centos                       This is docker images of CentOS 7 with diffe…   42                                      [OK]
fabric8/java-jboss-openjdk8-jdk          Fabric8 Java Base Image (JBoss, OpenJDK 8)      28                                      [OK]
...

# 下载镜像

docker pull java:8

# 查找镜像支持的版本

  • 进入docker hub官网,地址(https://hub.docker.com)
  • 搜索镜像
    docker
    docker
  • 镜像下载
docker pull nginx:1.19.0

# 列出镜像

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.19.0              2622e6cca7eb        3 weeks ago         132MB
[root@localhost ~]# 

# 删除镜像

  • 指定名称删除
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.19.0              2622e6cca7eb        3 weeks ago         132MB
java                8                   d23bdf5b1b1b        3 years ago         643MB
[root@localhost ~]# docker rmi java:8
Untagged: java:8
Untagged: java@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Deleted: sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8
Deleted: sha256:0132aeca1bc9ac49d397635d34675915693a8727b103639ddee3cc5438e0f60a
Deleted: sha256:c011315277e16e6c88687a6c683e388e2879f9a195113129a2ca12f782d9fcf9
Deleted: sha256:3181aa7c07970b525de9d3bd15c4c3710a2ab49fd5927df41e5586d9b89b1480
Deleted: sha256:b0053647bc72f97b7a9709a505a20a7a74a556c6aa025979e36532ff3df7cb8d
Deleted: sha256:0877f4904e80b44741cc07706b19c6d415724b20128f4b26ee59faec9a859416
Deleted: sha256:dbf7b16cf5d32dfec3058391a92361a09745421deb2491545964f8ba99b37fc2
Deleted: sha256:4cbc0ad7007fe8c2dfcf2cdc82fdb04f35070f0e2a04d5fa35093977a3cc1693
Deleted: sha256:a2ae92ffcd29f7ededa0320f4a4fd709a723beae9a4e681696874932db7aee2c
[root@localhost ~]# 
  • 指定名称删除:强制
docker rmi -f java:8
  • 删除所有没有引用的镜像
docker rmi `docker images | grep none | awk '{pring $3}'`
  • 强制删除所有镜像
docker rmi -f ${docker images}

# 修改Docker镜像存放位置

  • 查看Docker镜像存放位置
[root@localhost ~]# docker info | grep "Docker Root Dir"
 Docker Root Dir: /var/lib/docker
  • 关闭Docker服务 systemctl stop docker
  • 移动目录到目标路径 mv /var/lib/docker /mydata/docker
  • 建立软连接 ln -s /mydata/docker /var/lib/docker

# Docker容器常用命令

# 新建并启动容器

容器新建之后不需要再建

docker run -p 80:80 --name nginx -d nginx:1.19.0
  • -d:后台运行
  • --name:指定容器的名字,之后可以通过名字来操作容器
  • -p:指定端口映射,格式为hostPort:containerPort

# 列出容器

  • 列出运行中容器
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
828384d37220        nginx:1.19.0        "/docker-entrypoint.…"   24 hours ago        Up 21 seconds       0.0.0.0:80->80/tcp   nginx
  • 列出所有容器
[root@localhost ~]# docker ps -a

# 停止容器

docker stop $ContainerName(或者$ContainerId)

[root@localhost ~]# docker stop nginx
nginx
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
828384d37220        nginx:1.19.0        "/docker-entrypoint.…"   24 hours ago        Exited (0) 6 seconds ago                       nginx
[root@localhost ~]# 

# 强制停止容器

[root@localhost ~]# docker start nginx
nginx
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
828384d37220        nginx:1.19.0        "/docker-entrypoint.…"   25 hours ago        Up 3 seconds        0.0.0.0:80->80/tcp   nginx
[root@localhost ~]# docker kill nginx
nginx
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@localhost ~]# 

# 启动已停止的容器

docker start $ContainerName(或者$ContainerId)

[root@localhost ~]# docker start nginx
nginx
[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
828384d37220        nginx:1.19.0        "/docker-entrypoint.…"   25 hours ago        Up 3 seconds        0.0.0.0:80->80/tcp   nginx
[root@localhost ~]#

# 进入容器

  • 先查询出容器的pid
[root@localhost ~]# docker inspect --format "{{.State.Pid}}" nginx
53590
  • 根据pid进入容器
[root@localhost ~]# docker inspect --format "{{.State.Pid}}" nginx
53590
[root@localhost ~]# nsenter --target 53590 --mount --uts --ipc --net --pid
mesg: ttyname failed: No such device
root@828384d37220:/# 

# 删除容器

  • 删除指定容器
docker rm $ContainerName(或者$ContainerId)
  • 按名称删除容器
docker rm `docker ps -a | grep mall-* | awk '{print $1}'`
  • 强制删除所有容器
docker rm -f $(docker ps -a -q)

# 查看容器的日志

  • 查看当前全部日志
docker logs $ContainerName(或者$ContainerId)
  • 动态查看日志
docker logs $ContainerName(或者$ContainerId) -f
[root@localhost ~]# docker logs nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up

# 查看容器的ip

[root@localhost ~]# docker inspect --format '{{ .NetworkSettings.IPAddress }}' nginx
172.17.0.2

# 修改容器的启动方式

docker container update --restart=always $ContainerName

# 指定容器时区

docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-d nginx:1.19.0

##宿主机查看docker

# 查看指定容器

docker stats $ContainerName(或者$ContainerId)

[root@localhost ~]# docker stats nginx

# 查看所有容器

docker stats -a

# 查看docker磁盘使用

[root@localhost ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              1                   1                   132.1MB             0B (0%)
Containers          1                   1                   1.158kB             0B (0%)
Local Volumes       0                   0                   0B                  0B
Build Cache         0                   0                   0B                  0B

# 使用账号进入Docker容器

[root@localhost ~]# docker exec -it --user root nginx /bin/bash
root@828384d37220:/# 

# 创建外部网络

docker network create -d bridge my-bridge-network