Docker

介绍

Docker是一组平台即服务(PaaS)的产品。它基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。托管容器的软件称为Docker引擎。Docker能够帮助开发者在轻量级容器中自动部署应用程序,并使得不同容器中的应用程序彼此隔离,高效工作。

Docker安装

首先如果系统中已经存在旧的Docker,则先卸载

XML 复制代码
yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine \
    docker-selinux 

配置Docker的yum库

安装yum工具

XML 复制代码
yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源

XML 复制代码
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
​
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

更新yum,建立缓存

XML 复制代码
sudo yum makecache fast

如果无法配置yum库,请参考下一步操作解决**(能正常安装直接忽略)**

step 1:

XML 复制代码
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

step 2:

XML 复制代码
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

step3:

XML 复制代码
 yum clean all

step4:

XML 复制代码
yum makecache

执行完以上四步操作后,就解决啦

安装Docker

最后,执行命令,安装Docker

XML 复制代码
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动和校验
XML 复制代码
# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
配置镜像加速
XML 复制代码
# 创建目录
mkdir -p /etc/docker

# 复制内容
tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "http://hub-mirror.c.163.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://mirrors.sohu.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com",
        "https://ccr.ccs.tencentyun.com",
        "https://docker.m.daocloud.io",
        "https://docker.awsl9527.cn"
    ]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

快速入门

部署MySql

如果是利用传统方式部署MySQL,大概的步骤有

  • 搜索并下载MySQL安装包

  • 上传至Linux环境

  • 编译和配置环境

  • 安装

而使用Docker安装,仅仅需要一步即可,在命令输入下面的命令(建议采用CV大法)

XML 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql
  • docker run:创建并运行一个容器,-d是让容器在后台运行

  • --name mysql:给容器起个名字,必须唯一

  • -p 3306:3306:设置端口映射

  • -e KEY=VALUE:是设置环境变量

  • mysql:指定运行的镜像的名字

查看是否部署成功

命令

XML 复制代码
docker ps
命令别名

给常用Docker命令起别名,方便我们访问

XML 复制代码
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

然后执行该命令,使别名生效

XML 复制代码
source /root/.bashrc
常见命令

常见命令如下:

命令 说明 文档地址
docker pull 拉取镜像 docker pull
docker push 推送镜像到DockerRegistry docker push
docker images 查看本地镜像 docker images
docker rmi 删除本地镜像 docker rmi
docker run 创建并运行容器(不能重复创建) docker run
docker stop 停止指定容器 docker stop
docker start 启动指定容器 docker start
docker restart 重新启动容器 docker restart
docker rm 删除指定容器 docs.docker.com
docker ps 查看容器 docker ps
docker logs 查看容器运行日志 docker logs
docker exec 进入容器 docker exec
docker save 保存镜像到本地压缩文件 docker save
docker load 加载本地压缩文件到镜像 docker load
docker inspect 查看容器详细信息 docker inspect

如下图表示命令的关系

扩展知识
XML 复制代码
# Docker开机自启
systemctl enable docker

# Docker容器开机自启
docker update --restart=always [容器名/容器id]
数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机之间映射的桥梁。以Nginx为例,我们知道Nginx中有两个关键的目录

  • html:放置一些静态资源

  • conf:放置配置文件

如图所示
  • 我们创建了两个数据卷:conf、html

  • Nginx容器内部的conf目录和html目录分别与两个数据卷关联

  • 而数据卷conf和html分别指向了宿主机

    的/var/lib/docker/volumes/conf/_data目录

    和/var/lib/docker/volumes/html/_data目录

这样以来,容器内的conf和html目录就与宿主机的conf和html目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/conf/_data就是在操作容器内的 /usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了

数据卷命令
命令 说明
docker volume create 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷

容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建

演示

删除原有的nginx

创建nginx

查看数据卷

切换到该目录中

运行index.html

挂载本地目录或文件

可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便

在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法于数据卷类似

XML 复制代码
#挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

本地目录或文件必须以/或./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名

演示
  • 挂载/root/mysql/data到容器内的/var/lib/mysql目录

  • 挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)

  • 挂载/root/mysql/conf到容器内的/etc/mysql/conf.d(这个是MySQL配置文件目录)

    资料:通过百度网盘分享的文件:mysql.zip 链接:百度网盘 请输入提取码 提取码:6666

回到根目录,创建文件夹

创建并运行新mysql容器,挂载本地目录

XML 复制代码
docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  -v ./mysql/data:/var/lib/mysql \
  -v ./mysql/conf:/etc/mysql/conf.d \
  -v ./mysql/init:/docker-entrypoint-initdb.d \
  mysql

挂载成功

镜像

前面我们一直在使用别人准备好的镜像,那如果我们要部署一个Java项目,把它打包为一个镜像该怎么做呢

镜像结构

举个例子,我们要从0部署一个Java应用,大概流程是这样

  • 准备一个linux服务(CentOS或者Ubuntu均可)

  • 安装并配置JDK

  • 上传Jar包

  • 运行Jar包

那因此,我们打包镜像也是分成这么几步

  • 准备Linux运行环境(Java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

  • 安装并配置JDK

  • 拷贝jar包

  • 配置启动脚本

Dockerfile

常用命令

指令 说明 示例
FROM 指定基础镜像 FROM centos:6
ENV 设置环境变量,可在后面指令使用 ENV key value
COPY 拷贝本地文件到镜像的指定目录 COPY ./xx.jar /tmp/app.jar
RUN 执行Linux的shell命令,一般是安装过程的命令 RUN yum install gcc
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的 EXPOSE 8080
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用 ENTRYPOINT java -jar xx.jar

基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下

XML 复制代码
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
 && tar -xf ./jdk8.tar.gz \
 && mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

我们在此基础上制作Java镜像,就可以省去JDK配置了

XML 复制代码
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
构建镜像

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。

资料(网盘中自取):通过百度网盘分享的文件:demo.zip 链接:百度网盘 请输入提取码 提取码:6666

首先,我们将课前资料提供的docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录:

然后,执行命令,构建镜像:

XML 复制代码
# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo .

结果

输入命令docker images查询是否构建成功

运行自定义镜像

XML 复制代码
docker run -d --name dd -p 8080:8080 docker-demo

输入命令docker ps查询是否运行成功

输入命令docker logs -f dd查询日志

网络

首先,我们查看下MySQL容器的详细信息,重点关注其中的网络ip地址

XML 复制代码
# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql
# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.17.0.2

# 2.然后通过命令进入dd容器
docker exec -it dd bash

# 3.在容器内,通过ping命令测试网络
ping 172.17.0.2
# 结果
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms
常见命令
命令 说明 文档地址
docker network create 创建一个网络 docker network create
docker network ls 查看所有网络 docs.docker.com
docker network rm 删除指定网络 docs.docker.com
docker network prune 清除未使用的网络 docs.docker.com
docker network connect 使指定容器连接加入某网络 docs.docker.com
docker network disconnect 使指定容器连接离开某网络 docker network disconnect
docker network inspect 查看网络详细信息 docker network inspect
相关推荐
ks胤墨9 分钟前
Nginx Proxy Manager如何管理与配置反向代理服务并实现远程访问
运维·nginx
测试工程师成长之路1 小时前
解锁 Jenkins 搭建全攻略
运维·servlet·jenkins
单线程bug2 小时前
在 Mac M1 上使用 Docker 运行 Jenkins
macos·docker·jenkins
Bypass--2 小时前
《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制
安全·云原生·容器·kubernetes
freesky2 小时前
Ubuntu安装及删除httpd(Apache)
linux·运维·服务器·ubuntu·apache
码农老起3 小时前
常用代码开发工具技术分享
git·docker·github·visual studio code·visual studio
普通码农我姓吴3 小时前
【linux】shell(38)-数组
linux·运维·chrome
一只大老铁4 小时前
Ubuntu20.04解决docker安装后is the docker daemon running? 问题
java·docker·eureka
胡八一4 小时前
解决/var/lib/docker(默认的 Docker 数据目录)占用较大,并且所在磁盘空间不足
docker·harbor
Smile丶凉轩4 小时前
Docker的容器编排
运维·docker·容器