Docker

Docker 学习

Docker 概念

  • Docker 是一个开源的应用容器引擎
  • Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的linux机器上
  • 容器是完全使用沙箱机制,相互隔离
  • 容器性能开销极低
  • Docker 是一种容器技术,解决软件跨环境迁移的问题

Docker 安装

# 1. yum包更新到最新
yum update
# 2.安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是 devicemapper驱动依赖的
yum install ‐y yum‐utils device‐mapper‐persistent‐data lvm2
# 3. 设置yum 源 为阿里源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4.安装docker 加-y 自动选择
yum install -y docker-ce

配置阿里云镜像加速器

在这里插入图片描述

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xu4szdwv.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker 架构

  • 镜像(image) Docker 镜像,就相当于是一个root文件系统

  • 容器(Container) 镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行的实体。容器可以被创建、启动、停止、删除暂停等

  • 仓库(Repository) 仓库可以看成一个代码控制中心,用来保存镜像文件。

Docker 命令

  • Docker 服务相关命令
# 1.启动docker
 systemctl start docker
# 2.查看docker 服务状态
 systemctl status docker
# 3.停止docker 服务
 systemctl stop docker
# 4.重启docker服务
 systemctl restart docker
# 5.开机启动docker 
 systemctl enable docker
  • Docker 镜像相关命令
#1.查看本地镜像
 docker images
 docker images -q # 查看所有镜像的id
#2.搜索镜像
docker search redis
#3.拉取镜像
docker pull redis:tag  # tag 版本号不指定则使用默认最新版本 查询版本号可以从hub.docker.com 查询

# 4.删除镜像
docker rmi imageId

# 5.删除所有镜像
docker rmi 'docker images -q'	
  • Docker 容器相关命令
# 1. 查看容器
docker ps  # 查看正在运行的容器
docker ps -a # 查看所有的容器

# 2.运行容器
docker run -it --name=c1 redis:5.0 /bin/bash   # 分配一个终端,容器运行起来之后进入终端,退出终端容器停止
docker run -id --name=c2 redis:5.0  #后台运行容器

-i 保持容器的运行。通常和-t一起使用,会自动进入容器,容器退出之后,容器自动关闭
-d 以守护后台模式运行容器。创建一个容器在后台运行,需要使用docker exec进入容器,退出后,容器不会关闭
-it 交互式容器 

docker exec -it c2 /bin/bash  #进入后台启动的容器内部

# 停止容器
docker stop name/id
# 启动容器
docker start name/id
# 删除容器
docker rm name/id

docker rm `docker ps -aq` # 开启的容器不能被删除
# 查看容器信息
docker inspect name/id

Docker 容器的数据卷

数据卷是宿主机中的一个目录或者文件,当容器目录和数据卷目录绑定后,对方的修改会立即同步。可以用户做容器和宿主机之间的数据通信以及容器与外部的数据交互

数据卷配置

docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
# 使用 -v 参数设置数据卷
注意事项:
1.目录必须是绝对路径
2.如果目录不存在,会自动创建
3.可以挂载多个数据卷
通过同一个数据卷挂载两个容器进行数据同步
docker run -it --name=c2 \
> -v ~/root/data2:/root/data2 \
> -v ~/root/data3:/root/data3 \
> redis:5.0 /bin/bash

多容器进行数据交互:

  1. 多个容器挂载同一个数据卷容器

  2. 数据卷容器
# 1.创建启动C3 数据卷容器,使用-v 参数设置数据卷
docker run -it --name=c3 -v /volume redis:5.0 /bin/bash
# 2.创建启动c1,c2两个容器,使用 --volumes-from 参数设置数据卷
docker run -it --name=c1 --volumes-from c3 redis:5.0 /bin/bash
docker run -it --name=c2 --volumes-from c3 redis:5.0 /bin/bash

数据卷的作用:

  • 容器数据持久化
  • 客户端可以和容器进行数据交换
  • 容器数据之间相互交互

Docker 应用部署

  • MySQL 部署
# 1. 搜索mysql 镜像
docker search mysql
#2.拉取mysql 镜像
docker pull mysql:5.6
3.创建容器
mkdir ~/mysql
cd ~/mysql

docker run -id \
> -p 3306:3306 \   # 宿主机端口和容器端口进行绑定
> --name=c_mysql \
> -v $PWD/conf:/ect/mysql/conf.d \
> -v $PWD/logs:/logs \
> -v $PWD/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123456 \
> mysql:5.6

4.操作容器中的mysql
  • Tomcat部署
# 1. 搜索Tomcat 镜像
docker search tomcat
# 2. 拉取镜像
docker pull tomcat

# 3.创建容器
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
> -p 8080:8080 \
> -v $PWD:/usr/local/tomcat/webapps \
> tomcat
  • nginx 部署
# 1. 搜索nginx 镜像
docker search nginx
# 拉取nginx 镜像
docker pull nginx

# 创建容器
mkdir ~/nginx
cd ~/nginx
mkdir conf

# 获取nginx.conf 文件
docker run --rm --name nginx-test -p 8081:80 -d nginx

参数说明 --rm 容器停止运行后会自动删除容器

复制容器中的nginx.conf 到~/nginx/conf 目录下
docker cp a24e6175352a:/etc/nginx/nginx.conf /root/nginx/conf/

重新运行nginx 容器
docker run -id --name=c_nginx -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 将容器的端口映射到宿主机的端口
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf 将当前主机的nginx.conf 文件挂载到容器的 :/etc/nginx/nginx.conf
-v $PWD/logs:/var/log/nginx 挂载日志目录

nginx.conf 文件

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
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;
}

  • Redis 部署
# 1. 搜索redis 镜像
docker search redis
# 2.拉取redis镜像
docker pull redis:5.0
#3.创建容器,设置映射端口
docker run -id --name=c_redis -p 6379:6379 redis:5.0
# 4.使用外部机器连接redis
./redis-cli.exe -h 192.168.0.88 -p 6379

Dockerfile

Docker 镜像原理:
Docker 镜像是由特殊的文件系统叠加而成

最底端是bootfs ,并使用宿主机的bootfs

第二层是root 文件系统rootfs, 称为base image

再往上可以叠加其他的镜像文件
统一文件系统技术能够将不同层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像
Docker 镜像本质是一个分层文件系统

Docker 中一个centos 镜像为什么只有200MB,而一个centos 操作系统的iso文件几个G

centos的ios文件包含bootfs 和rootfs 而docker 的centos 镜像会复用宿主机的bootfs ,只有rootfs 和其他镜像层

Docker 中一个Tomcat 镜像为什么有500M 和tomcat 安装包只有70多M

由于docker 中镜像是分层的,tomcat 需要依赖于父镜像和基础镜像,所以整个对外暴露有几百兆

  • 镜像制作
# 1通过容器制作镜像
docker commit 容器id  镜像名称:版本号  

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

docker load -i 压缩文件名称
# 2.通过Dockerfile 构建镜像 
# Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
# Dockerfile 常用关键字
FROM  指定父镜像

MAINTAINER 作者信息
LABEL 标签

RUN 执行命令
CMD 容器启动命令

ENTRYPOINT 入口

COPY 复制文件

ADD 添加文件

ENV 环境变量

ARG 构建参数

VOLUME 定义外部可以挂载的数据卷

EXPOSE 暴露端口

WORKDIR 工作目录

USER 指定执行用户

SHELL 指定执行shell脚本

使用dockerfile 文件构建centos镜像,并安装vim

# 1.新建centos-dockerfile 文件
FROM centos:7
MAINTAINER huhengzhang <1205475282@qq.com>
RUN yum install -y vim

WORKDIR /usr

CMD /bin/bash

# 2.通过docker build 构建镜像
docker build -f dockerfile 文件路径 -t 镜像名称:版本号

使用dockerfile 构建springboot 项目镜像

# 1.新建spring-dockerfile 文件
FROM java:8
MAINTAINER huhengzhang <1205475282@qq.com>
ADD springboot-helloworld-1.0-SNAPSHOT.jar app.jar
CMD java -jar app.jar

Docker Compose

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
使用步骤:

  1. 利用dockerfile 定义运行环境镜像
  2. 使用docekr-compose.yml 定义组成应用的各服务
  3. 运行docker-compose up 启动应用

docker-compose安装

curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose

# 查看版本信息
docker-compose -version

使用docker-compose 编排nginx+springboot
1.编写docker-compose.yml 文件

version: '3'
services:
  nginx:
    images: nginx .
    ports:
   		- 80:80
    volumes:
    	- ./nginx/conf.d:/etc/nginx/conf.d
    links:
   		- app
  app:
    image: app
    expose:
    	- "8080"

2.创建nginx 配置文件

server {
    listen    80;
    access_log   off;

    location / {
        proxy_pass http://app:8080;
    }

}

3.使用docker-compose up 启用应用程序

Docker 私有仓库

Docker 私有仓库来管理镜像,registry其实也是一个镜像

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

# 2.启动私有仓库器
docker run -id --name=registry -p 5000:5000 registry
# 3.访问私有仓库服务器
http:私有仓库服务器ip:5000/v2/_catalog

# 4.修改daemon.json 此步让docker 信任私有仓库地址
  vi /etc/docker/daemon.json
 "insecure-registries": ["192.168.0.88:5000"]
# 5.刷新配置重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
 
#将镜像上传到私有仓库
# 1.标记镜像为私有仓库镜像
docker tag centos:7 私有仓库服务器ip:5000/centos:7

#2.上传镜像
 docker push 192.168.0.88:5000/centos:7

# 3.拉取到本地

docker pull 192.168.0.88:5000/centos:7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值