docker

概念

一个开源的应用容器引擎。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口

容器性能开销极低。

docker是一种容器技术,解决软件跨环境迁移问题。

安装

  1. 卸载旧版本

    sudo yum remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                      docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    
  2. 安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

    sudo yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2
    
  3. 设置稳定的仓库

    sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    
  4. 安装最新版本的 Docker Engine-Community 和 containerd

    sudo yum install docker-ce docker-ce-cli containerd.io
    
  5. 查看是否安装成功

    docker -v
    

启动 Docker

sudo systemctl start docker

卸载docker

# 删除安装包
yum remove docker-ce
# 删除镜像、容器、配置文件等内容
rm -rf /var/lib/docker

Docker架构

  • 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
  • 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
  • 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。

配置镜像加速

容器镜像服务 (aliyun.com)

image-20210607111807490

运行命令即可。

命令

服务相关命令

  1. 启动docker
    systemctl start docker
  2. 停止docker
    systemctl stop docker
  3. 重启docker
    systemctl restart docker
  4. 开机启动docker
    systemctl enable docker
  5. 查看docker状态
    systemctl status docker

镜像相关命令

  1. 查看镜像
    docker images

  2. 搜索镜像
    docker search 镜像名(redis)

  3. 拉取镜像
    docker pull redis:6.2.4

    docker镜像搜索

  4. 删除镜像
    docker rmi redis:latest(或镜像 ID)
    删除所有镜像

docker rmi `docker images -q`

容器相关命令

  1. 查看容器

    docker ps # 查看正在运行的容器

    docker ps -a # 查所有容器

  2. 创建并启动容器

    docker run 参数 镜像 进入容器的第一条命令

    docker run -id --name=redis2 redis:6.2.4 /bin/bash

    参数:

    • -i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
    • -t:为容器重新分配一个伪输入终端,通常与-i同时使用。
    • -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec -it 容器名 /bin/bash进入容器。退出后,容器不会关闭。
    • -it 创建的容器一般称为交互式容器,-id创建的容器一般称为守护式容器
    • –name:为创建的容器命名。
  3. 进入容器

    docker exec -it 容器名 /bin/bash

  4. 停止容器

    docker stop 容器名

  5. 启动容器

    docker start 容器名

  6. 删除容器

    docker rm 容器名称

  7. 查看容器信息

    docker inspect 容器名称

docker容器的数据卷

概念

  • 数据卷是宿主机中的一个目录或文件
  • 当容器目录和数据卷目录绑定后,对方的修改会立即同步
  • 一个数据卷可以被多个容器同时挂载
  • 一个容器也可以被挂载多个数据卷

作用

  • 容器数据持久化
  • 外部机器和容器通信
  • 容器之间数据交换

配置数据卷

创建启动容器时,使用 -v 参数

docker run ... -v 宿主机目录(文件):容器内目录(文件)

  1. docker run -id --name=c1 -v /root/data:/root/data_container centos:latest /bin/bash

  2. docker run -id --name=c1 -v /root/data:/root/data_container -v /root/data2:/root/data_container2 centos:latest /bin/bash

注意:

  1. 目录必须是绝对路径
  2. 目录不存在,自动创建
  3. 可以挂载多个数据卷

数据卷容器

image-20210607221147420

  1. 创建启动 c3 数据卷容器,使用 -v参数设置数据卷
    docker run -it --name=c3 -v /volume centos:7 /bin/bash

  2. 创建启动c1c2容器,使用 --volumes-from参数设置数据卷
    docker run -it --name=c1 --volumes-from c3 centos:7 /bin/bash

    docker run -it --name=c2 --volumes-from c3 centos:7 /bin/bash

即使 c3 挂了也不影响 c1 c2之间的通信。

docker应用部署

端口映射

容器内的网络服务和外部机器不能直接通信

外部机器和宿主机可以通信

宿主机和容器可以直接通信

端口映射:当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机器访问宿主机的该端口,从而间接访问容器的服务, -p参数。

MySql

  1. 拉取镜像

  2. 创建容器,设置端口映射、目录映射。

    # 在/root目录下创建 mysql目录用于存储mysql数据信息
    
    mkdir /root/mysql
    cd /root/mysql
    
    # 创建
    docker run -id \
    -p 3307:3306 \
    --name=mysql1 \
    -v $PWD/conf:/etc/mysql/conf.d \
    -v $PWD/logs:/logs \
    -v $PWD/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    mysql:5.7
    
    • -p 3307:3306:将容器的3306端口映射到宿主机的3307端口
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf挂载到容器的/etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs。日志目录
    • -v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql。数据目录
    • -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

tomcat

  1. 拉取镜像

  2. 创建容器,设置端口映射、目录映射。

    # 在/root目录下创建 tomcat 目录用于存储tomcat数据信息
    
    mkdir /root/tomcat
    cd /root/tomcat
    
    # 创建容器
    
    docker run -id --name=tomcat1 \
    -p 8080:8080 \
    -v $PWD:/usr/local/tomcat/webapps \
    tomcat
    
    • -p 8080:8080:将容器的8080端口映射到主机的8080端口
    • -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的 webapps

nginx

  1. 拉取镜像

  2. 创建容器,设置端口映射、目录映射。

    # 在/root目录下创建 nginx 目录用于存储nginx数据信息
    
    mkdir /root/nginx
    cd /root/nginx
    
    # 在 /root/nginx/conf 下创建nginx.conf 文件,粘贴下遍内容
    mkdir conf
    cd conf
    vim nginx.conf
    
    
    user  nginx;
    worker_processes  1;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        keepalive_timeout  65;
    
        #gzip  on;
    
        include /etc/nginx/conf.d/*.conf;
    }
    
    
    # 先退回 /root/nginx
    cd ..
    
    docker run -id --name=nginx1 \
    -p 80:80 \
    -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v $PWD/logs:/var/log/nginx \
    -v $PWD/html:/usr/share/nginx/html \
    nginx
    
    • -p 80:80:将容器的80端口映射到宿主机的80端口
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的/conf/nginx.conf挂载到容器的/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的logs目录挂载到容器的/var/log/nginx。日志目录

redis

  1. 拉取镜像

  2. 创建容器,设置端口映射

    docker run -id --name=redis1 -p 6379:6379 redis:5.0
    
  3. 外部机器连接

    redis-cli.exe -h ip地址 -p 6379
    

Dockerfile

docker镜像原理

  • Docker镜像由特殊的文件系统叠加而成。
  • 最底端是 bootfs,并使用宿主机的 bootfs
  • 第二层是root文件系统 rootfs称为 base image,然后再往上可以叠加其他的镜像文件
  • 统一文件系统( Union File system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
  • 一个镜像可以放在另—个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时, Docker会在最顶层加载一个读写文件系统作为容器

image-20210608111307544

镜像制作:

1. 容器转为镜像

docker commit 容器id 镜像名称:版本号 容器转为镜像

docker save -o 压缩文件名称 镜像名称:版本号 镜像转为压缩文件

docker load -i 压缩文件名称 压缩文件还原为镜像

挂载的数据卷是不会在新镜像中的。

2. dockerfile

例子:假设已经有 app.jar的springboot项目包

dockerfile文件内容为

FROM java:8
MAINTAINER 作者信息
ADD app.jar app.jar
CMD java -jar app.jar

执行dockerfile文件,生成镜像。

docker build -f dockerfile文件 -t nginx:v3 .

compose

服务编排

按照一定的业务规则批量管理容器。

docker compose

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建启动和停止。

使用步骤

  1. 利用 Dockerfile定义运行环境镜像
  2. 使用 docker-compose.yml定义组成应用的各服务
  3. 运行 docker-compose up启动应用
compose安装
# 运行以下命令以下载 Docker Compose 的当前稳定版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 将可执行权限应用于二进制文件
sudo chmod a+x /usr/local/bin/docker-compose

# 创建软链
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

# 测试是否安装成功
docker-compose --version
例子:使用compose编排 nginx+springboot项目

有一个叫nginx的镜像、一个叫app的镜像(里面有个springboot项目)

  1. 新建目录,进入后 vim docker-compose.yml,内容为:

    # yaml 配置
    version: '3'
    services:
      nginx:
      	image: nginx
        ports:
         - 80:80
         links: 
         - app
         volumes:
         - ./nginx/conf.d: /etc/nginx/conf.d
      app:
        image: app
        expose: 
        - "8080"
    
  2. 创建./nginx/conf.d 目录,进入编写nginx配置文件 nginx.conf

    mkdir -p ./nginx/conf.d

    cd ./nginx/conf.d

    vim nginx.conf

    server {
    	listen 80;
    	access_log off;
    	
    	location / {
    		proxy_pass http://app:8080
    	}
    }
    
  3. 在dockercompose新建目录中 使用 docker-compose up -d启动容器。 -d选项为在后台运行

私有仓库

搭建私有仓库

#1、拉取私有仓库镜像
docker pull registry

#2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry

#3、打开浏览器输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到["repositories":[]}表示私有仓库搭建成功

# 上面的在私有仓库机器上,下面的在自己的机器上。

#4、修改 daemon.json
vim /etc/docker/daemon.json
#在上述文件中添加一个key,保存退出。此步用于让 docker信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries": ["私有仓库服务器ip:5000"]}

# 5重启docker服务
systemctl restart docker
docker start registry

上传镜像

# 标记镜像为私有仓库镜像
docker tag centos:7 私有仓库Ip:5000/centos:7

# 上传标记的镜像
docker push 私有仓库ip:5000/centos:7

拉取镜像

docker pull 私有仓库Ip:5000/centos:7

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值