dsg_26 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)

718 22:00:13 Centos113 systemd[1]: Starting Docker Application Container Engine...
718 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"
718 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"
718 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)
718 22:00:14 Centos113 systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
718 22:00:14 Centos113 systemd[1]: Failed to start Docker Application Container Engine.
718 22:00:14 Centos113 systemd[1]: Unit docker.service entered failed state.
718 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,代表最新版本的镜像

在这里插入图片描述

# 具体使用查看命令帮助文档
[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:是否由官方镜像仓库自动构建的
🍒容器操作

在这里插入图片描述

#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镜像
在这里插入图片描述

🍒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
    
  2. 私服采用的是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
    
  3. 执行docker-compose.yml
    [root@centos100 private-HUB]# docker-compose up -d
    
  4. 访问http://192.168.113.100:8080/
  5. 上传一个镜像到私有仓库
    #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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值