docker

  • 🍓Docker是什么
  • 🍓Docker与传统虚拟机的区别
  • 🍓Docker组件
  • 🍓安装Docker
  • 🍒镜像加速
  • 🍒启动失败
  • 🍓Docker基本命令
  • 🍒镜像操作
  • 🍒容器操作
  • 🍒交互命令
  • 🍓自定义镜像
  • 🍒镜像结构
  • 🍒Dockerfile
  • 🍒docker-compose
  • 🍅安装docker-compose
  • 🍒docker-compose命令
  • 🍅up
  • 🍅ps
  • 🍅stop
  • 🍅down
  • 🍅restart
  • 🍅rm
  • 🍅exec
  • 🍒compose模板文件
  • 🍒使用compose同时启动tomcat、mysql和 redis
  • 🍓Docker镜像仓库
  • 🍒Docker私人仓库搭建
  • 🍓迁移与备份
  • 🍓Docker容器与宿主机时间不一致的问题


🍓Docker是什么

Docker是一个应用容器引擎,web的自动化打包发布,自动化测试,可持续集成,安装各种组件

🍓Docker与传统虚拟机的区别

  • Docker是对系统应用所必须的函数进行封装,而虚拟机则是在一个操作系统上搭建了另外一套操作系统
  • Docker不包含系统内核,只有系统应用;而虚拟机包含了一套完整的系统(内核+应用)
  • Docker体积小,启动速度快,虚拟机启动速度慢
  • 我们可以在Linux操作系统上安装任何内核是LinuxDocker容器,如CentosUbuntu,但我们不能安装WindowsDocker容器,因为在Linux系统上没有Windows系统的内核,但我们可以在Linux系统上安装Windows的虚拟机,因为虚拟机包含内核

🍓Docker组件

  1. Docker镜像,用于创建Docker容器的模板。
  2. Docker容器,是镜像创建的运行实例,一个完整的应用。
  3. Docker客户端,通过命令或者其他工具使用Docker APIDocker守护进程
  4. Docker守护进程,负责支撑Docker容器的运行和管理
  5. Docker仓库,是集中存放镜像文件的场所。仓库注册服务器存在多个仓库,每个仓库存在多个镜像,每个镜像有不同的标签。 仓库分公有仓库(Docker Hub)和私有仓库

🍓安装Docker

Docker安装的最低Linux内核要求是3.10版本的,所以Docker需要安装在Centos7以上的系统版本上

#1. 安装之前先卸载以前的Docker
[root@Centos100 ~]# yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce
#2. 配置yum-utils工具(需联网)
[root@Centos100 ~]# yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

#3. 设置docker镜像源
[root@Centos100 ~]# yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
#4. 解决域名问题
[root@Centos100 ~]# sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

#5. 更新镜像源缓存
[root@Centos100 ~]# yum makecache fast

#6. 安装Docker-ce社区版
[root@Centos100 ~]# yum install -y docker-ce

#7. 启动Docker
[root@Centos100 ~]# systemctl start docker

#8. 查看Docker运行状态
[root@centos100 /]# systemctl status docker

#9. 停止Docker
[root@Centos100 ~]# systemctl stop docker

#10. 重启Docker
[root@Centos100 ~]# systemctl restart docker

#11. 查看docker版本
[root@Centos113 ~]# docker -v

#12. 设置docker随系统启动自动加载
[root@Centos113 software]# chkconfig docker on
🍒镜像加速

参考阿里云镜像加速帮助文档

[root@centos100 /]# mkdir -p /etc/docker
[root@centos100 /]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://cywpget6.mirror.aliyuncs.com"]
}
EOF
[root@centos100 /]# systemctl daemon-reload
[root@centos100 /]# systemctl restart docker
🍒启动失败
#1. 遇到启动失败查看docker启动状态和错误原因:SELinux is not supported with the overlay2 graph driver on this kernel
[root@Centos113 software]# service docker status
Redirecting to /bin/systemctl status  docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 日 2021-07-18 22:00:14 CST; 55min ago
     Docs: http://docs.docker.com
  Process: 31455 ExecStart=/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 --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json $OPTIONS $DOCKER_STORAGE_OPTIONS $DOCKER_NETWORK_OPTIONS $ADD_REGISTRY $BLOCK_REGISTRY $INSECURE_REGISTRY $REGISTRIES (code=exited, status=1/FAILURE)
 Main PID: 31455 (code=exited, status=1/FAILURE)

7月 18 22:00:13 Centos113 systemd[1]: Starting Docker Application Container Engine...
7月 18 22:00:13 Centos113 dockerd-current[31455]: time="2021-07-18T22:00:13.651015690+08:00" level=warning msg="could not change group /var/run/docker.sock to docker: group docker not found"
7月 18 22:00:13 Centos113 dockerd-current[31455]: time="2021-07-18T22:00:13.659536607+08:00" level=info msg="libcontainerd: new containerd process, pid: 31461"
7月 18 22:00:14 Centos113 dockerd-current[31455]: Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot into a newer kernel or disable selinux in...enabled=false)
7月 18 22:00:14 Centos113 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
7月 18 22:00:14 Centos113 systemd[1]: Failed to start Docker Application Container Engine.
7月 18 22:00:14 Centos113 systemd[1]: Unit docker.service entered failed state.
7月 18 22:00:14 Centos113 systemd[1]: docker.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

#2. 根据上面的错误原因修改docker配置文件,将参数selinux-enabled设置为false
[root@Centos113 software]# vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'

#3. 重新启动docker

#4. 查看docker启动状态

🍓Docker基本命令

🍒镜像操作

镜像仓库DockerHub

  • 镜像名称一般分两部分组成:[repository]:[tag]。
  • 在没有指定tag时,默认是latest,代表最新版本的镜像

容器下磁盘空间怎么看 容器disk25_Docker

# 具体使用查看命令帮助文档
[root@centos100 /]# docker images --help
#示例
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
#功能描述
List images
#参数
Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs

#搜索centos7的镜像
[root@Centos113 docker]# docker search centos7
NAME                                DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ansible/centos7-ansible             Ansible on Centos7                              134                  [OK]
paigeeworld/centos7                 Centos7 with apache, iperf3, nmap, ssh          6                    
flyceek/centos7-jdk                 centos7-jdk                                     5                    [OK]

#删除所有镜像
[root@Centos113 docker]# docker rmi `docker images -q`
  • NAME:镜像名称
  • DESCRIPTION:镜像描述
  • STARS:星级,即受欢迎程度
  • OFFICIAL:是否官方制作
  • AUTOMATED:是否由官方镜像仓库自动构建的
🍒容器操作

容器下磁盘空间怎么看 容器disk25_linux_02

#1. 查看容器
#参数: -a:查看所有容器(不加默认查看正在运行的容器)
[root@Centos113 docker]# docker ps

#2. 创建或运行容器
#参数:
-i:		#运行容器
-t:		#容器启动后进入命令行
--name:	#指定容器的名称
-v:		#目录映射关系(前者是宿主机的目录,后者是容器内的目录),可以使用多个-v做多目录或文件映射(这样可以使容器与数据文件相分隔)注意:多级目录如果出现权限不足的问题,可以添加参数--privileged=true来解决挂载目录没有权限的问题)
-d:		#创建一个守护容器在后台运行
-p:		#端口映射(前者是宿主机端口,后者是容器内的映射端口),可以使用多个-p做多个端口映射
-e:			#设置环境变量
[root@centos100 /]# docker run --name nx -p 80:80 -d  -v /docker/data/nginx:/usr/share/nginx/html nginx:latest

#demo
## Mysql容器创建启动
docker run -d -p 3306:3306 \
-v /config/mysql:/etc/mysql/conf.d \
-v /data/mysql:/var/lib/mysql	\
-e MYSQL_ROOT_PASSWORD=123456
--name mysql
mysql:lastest

#3. 查看容器运行日志
#参数:
-f : 		#持续查看日志
docker logs

#4. 进入容器
#参数:
-it : 		#给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
bash:		#进入容器后执行的命令,bash是一个linux终端交互命令
[root@centos100 /]# docker exec -it nx bash

#5. 退出容器
root@8b7983a8a1ef:/# exit

#6. 停止容器
[root@centos100 /]# docker stop nx

#7. 启动容器
[root@centos100 /]# docker start nx

#8. 删除容器
#参数:
-f:		#强制删除容器
[root@centos100 /]# docker rm nx
#删除所有容器
[root@Centos100 /]# docker rm `docker ps -a -q`
🍒交互命令
#1文件上传下载都是在本地执行命令的
#1-1 文件上传,将本地文件a.txt上传到容器mycentos2根目录上
[root@Centos113 ~]# docker cp a.txt mycentos2:/

#1-2 文件下载,将容器mycentos2根目录上的a.txt文件下载到本地home目录下
[root@Centos113 ~]# docker cp mycentos2:/a.txt /home/

#2 查看容器的ip
[root@Centos113 test]# docker inspect mycentos3

🍓自定义镜像

🍒镜像结构

镜像是分层结构,每一层称为一个Layer

  • BaseImage层:包含基本的系统函数库、环境变量、文件系统
  • Entrypoint:入口,是镜像中应用启动的命令
  • 其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置

例如: mysql镜像

容器下磁盘空间怎么看 容器disk25_docker_03

🍒Dockerfile

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

指令

说明

示例

FROM

指定基础镜像

FROM centos:6

ENV

设置环境变量,可在后面指令使用

ENV key value

COPY

拷贝本地文件到镜像的指定目录

COPY ./mysql-5.7.rpm /tmp

RUN

执行Linux的shell命令,一般是安装过程的命令

RUN yum install gcc

EXPOSE

指定容器运行时监听的端口,是给镜像使用者看的

EXPOSE 8080

ENTRYPOINT

镜像中应用的启动命令,容器运行时调用

ENTRYPOINT java -jar xx.jar

demo: 使用一个空白镜像制作一个tomcat镜像

#1. 创建一个文件,名字叫Dockerfile,不可随意更改名字,并写入下面的内容
[root@centos100 tmp]# vi Dockerfile
#2. 在Dockerfile同级目录放入jdk压缩包和tomcat压缩包
#3. 创建自定义镜像(注意最后命令最后的点,它指定了Dockerfile所在的目录)
#参数:-t: 镜像名称:镜像版本
[root@centos100 tmp]# docker build -t web:1.0 . 
#4. 查看镜像是否要制作完成
#5. 创建容器
#6. 查看容器日志

Dockerfile:

# 指定基础镜像
FROM centos:centos7
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local

# 拷贝jdk和java项目的包
COPY ./server-jre-8u281-linux-x64.tar.gz $JAVA_DIR/
COPY ./apache-tomcat-9.0.41.tar.gz /tmp/apache-tomcat-9.0.41.tar.gz

# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./server-jre-8u281-linux-x64.tar.gz \
 && mv ./jdk1.8.0_281 ./java8
 
# 解压tomcat
RUN mkdir -p /software/webApp \
 && tar -xf /tmp/apache-tomcat-9.0.41.tar.gz -C /software/webApp/ \
 && mv /software/webApp/apache-tomcat-9.0.41 /software/webApp/tomcat8080
 

# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令(注意:这边的日志必须实时打印在控制台,不然之后运行容器时,Docker监测不到日志会自动关闭的)
ENTRYPOINT /software/webApp/tomcat8080/bin/startup.sh && tail -f /software/webApp/tomcat8080/logs/catalina.out
🍒docker-compose

作用: 帮助我们快速部署分布式应用,无需一个个去构建镜像和部署。

🍅安装docker-compose
#1. 执行以下命令下载compose
[root@Centos100 /]# curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#2. 给/usr/local/bin/docker-compose赋予可执行权限
[root@Centos100 /]# chmod u+x /usr/local/bin/docker-compose

#3. 查看compose的版本
[root@Centos100 /]# docker-compose -version

#4. docker命令自动补全
[root@Centos100 /]# echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts
[root@Centos100 /]# curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
🍒docker-compose命令
🍅up
#通过下面的命令启动一个项目
docker-compose up

#可选参数:
-d							#在后台运行服务容器
-no-color					#不使用颜色来区分不同的服务的控制输出
-no-deps					#不启动服务所链接的容器
-force-recreate				#强制重新创建容器,不能与-no-recreate同时使用
-no-recreate				#如果容器已经存在,则不重新创建,不能与-force-recreate同时使用
-no-bui1d					#不自动构建缺失的服务镜像
-build						#在启动容器前构建服务镜像
-abort-on-container-exit	#停止所有容器,如果任何一个容器被停止,不能与-d同时使用
-t, --timeout TIMEOUT		#停止窑器时候的超时((默认为10秒)
-remove-orphans				#蒯除服务中没有在compose文件中定义的容器
-scale SERVICE=NUM			#设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
🍅ps
# 查看项目中目前的所有容器
docker-compose ps

#可选参数
-q							#只打印容器的ID信息
🍅stop
#停止已经运行的容器,但不删除
docker-compose stop

#可选参数
-t, --timeout TIMEOUT		#停止窑器时候的超时((默认为10秒)
🍅down
#停止已经运行的容器,并且删除容器,网络,卷,镜像,默认情况只删除容器和网络,添加可选参数可以选择性删除卷,镜像
docker-compose down

#可选参数
-rmi type			#删除镜像,类型必须是: ‘a11':删除compose文件中定义的所以镜像;‘1ocal':删除镜像名为空的镜像
-v, --volumes		#删除已经在compose文件中定义的和匿名的附在容器上的数据卷
-remove-orphans		#删除服务中没有在compose中定义的容器
🍅restart
#重启
docker-compose restart
🍅rm
#删除停止状态的服务容器
docker-compose rm

#可选参数
-f, --force			#强制直接删除,包括非停止状态的容器
-v					#删除容器所挂载的数据卷
🍅exec
#登录到某容器中
docker-compose exec

#可选参数
-d							#分离模式,后台运行命令.
-privileged					#获取特权.
-user USER 					#指定运行的用户.
-T							#禁用分配TTY. By default docker-compose exec分配a TTY.
-index=index				#当一个服务拥有多个容器时,可通过该参数登陆到该服务下的任何服务,例如:docker-composeexec --index=1 web /bin/bash , web服务中包含多个容器
🍒compose模板文件

默认模板文件名称为docker-compose.yml

version: "2"						#版本号(自定义)
services:							#服务
	web:							#服务名称(自定义)
		image: nginx				#镜像
		container_name: "nginx1"	#容器名称
		ports:						#端口映射
			- "8080:80"
		volumes:					#挂载目录
			- /usr/local/abc:/usr/local/cba
#volumes:

#networks:
🍒使用compose同时启动tomcat、mysql和 redis
#1. 创建一个文件夹mycompose
[root@Centos113 /]# mkdir /usr/local/mycompose
#2. 到mycompose目录下编写docker-compose.yml文件

docker-compose.yml:

version: '3'
services:
    redis1:
        image: redis
        ports:
            - "6379:6379"
        container_name: "redis1"
        networks:
            - dev
    mysql1:
        image: centos/mysql-57-centos7
        environment:
            MYSQL_ROOT_PASSWORD: "root"
        ports:
            - "3306:3306"
        container_name:  "mysql1"
        networks:
            - dev
    web1:
        image: tomcat
        ports:
            - "9090:8080"
        container_name: "web1"
        networks:
            - dev
            - pro
networks:
    dev:
        driver: bridge
    pro:
        driver: bridge

上面设置的networks网络表示服务redis1,mysql1,web1处于同一个局域网dev中,所以他们之间是可以相互连接的,web1同时还可以连接另外一个局域网pro,最后定义局域网dev和pro都是bridge(桥接 模式 )

# 在后台启动这三个容器
[root@Centos113 mycompose]# docker-compose up -d
Creating network "mycompose_dev" with driver "bridge"
Creating network "mycompose_pro" with driver "bridge"
Creating web1   ... done
Creating mysql1 ... done
Creating redis1 ... done

#查看容器启动状态
[root@Centos113 mycompose]# docker ps
CONTAINER ID   IMAGE                     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
661005a82f8c   redis                     "docker-entrypoint.s…"   14 seconds ago   Up 12 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis1
e551097781d4   centos/mysql-57-centos7   "container-entrypoin…"   14 seconds ago   Up 12 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp   mysql1
ec74edf24e18   tomcat                    "catalina.sh run"        14 seconds ago   Up 12 seconds   0.0.0.0:9090->8080/tcp, :::9090->8080/tcp   web1

🍓Docker镜像仓库

Docker镜像仓库分公有(DockerHub)和私人,在工作中我们需要搭建属于我们公司的私人仓库

🍒Docker私人仓库搭建
  1. 创建文件夹,并在里面创建一个docker-compose.yml
version: '3.0'
services:
  registry:
    image: registry	#私有仓库的名称
    volumes:	#私有仓库数据卷挂载
      - ./registry-data:/var/lib/registry
  ui:	#图形化管理界面
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=XXX私有仓库
      - REGISTRY_URL=http://registry:5000	#私有仓库的地址
    depends_on:	#依赖的私有仓库名称
      - registry
  1. 私服采用的是http协议,默认不被Docker信任,需要做以下配置
#1. 添加如下配置
	[root@centos100 private-HUB]# vi /etc/docker/daemon.json
	"insecure-registries":["http://192.168.113.100:8080"]
	
	#2. 重新加载配置并重启Docker
	[root@centos100 private-HUB]# systemctl daemon-reload
	[root@centos100 private-HUB]# systemctl restart docker
  1. 执行docker-compose.yml
[root@centos100 private-HUB]# docker-compose up -d
  1. 访问http://192.168.113.100:8080/
  2. 上传一个镜像到私有仓库
#1. 重新tag本地镜像,名称前缀为私有仓库的地址:192.168.113.100:8080/
[root@centos100 private-HUB]# docker tag nginx:latest 192.168.113.100:8080/nginx:1.0

#2. 上传镜像
[root@centos100 private-HUB]# docker push 192.168.113.100:8080/nginx:1.0

#3. 拉取镜像
[root@centos100 private-HUB]# docker pull 192.168.113.100:8080/nginx:1.0

🍓迁移与备份


拉取镜像 docker pull

根据镜像启动容器 docker run

容器中安装jdk,tomcat

保存为镜像 docker commit

备份镜像 docker save

迁移

恢复 docker load

根据镜像启动容器 docker run

docker仓库

Centos镜像

容器

容器包含jdk,tomcat

新镜像包含jdk,tomcat

镜像tar文件

镜像tar文件到其他服务器

镜像包含jdk,tomcat

容器包含jdk,tomcat


#1. 将容器myNginx保存为一个新的镜像mynginx,注意镜像名称必须全部小写
[root@Centos113 ~]# docker commit myNginx mynginx

#2. 保存镜像为tar文件到当前目录下
[root@Centos113 ~]# docker save -o mynginx.tar mynginx

#3. 删除本地容器及其镜像
[root@Centos113 ~]# docker rm myNginx
[root@Centos113 ~]# docker rmi nginx
[root@Centos113 ~]# docker rmi mynginx

#4. 恢复镜像 
[root@Centos113 ~]# docker load -i mynginx.tar

#5. 运行镜像
[root@Centos113 ~]# docker run -di --name=mynginx -p 80:80 mynginx

🍓Docker容器与宿主机时间不一致的问题

Docker容器的时间取自宿主机,如果出现时间不一致的情况,大多数应该是因为时区不同,进入Docker容器输入以下命令,修改时区

echo "Asia/Shanghai" > /etc/timezone

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

date