安装docker,我们选择的是CentenOS 7。

目录

Docker安装

命令

命令别名

数据卷挂载

Dockerfile

容器网络互联


Docker安装

1. 先删除本机旧的或者残留的docker

sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine

2.安装依赖

sudo yum update -y && sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2

3.配置镜像源

到这一步需要注意了,以前使用的很多都是这个https://download.docker.com/linux/centos/docker-ce.repo,现在需要换成国内的,执行如下命令:

# 阿里源
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# or
# 清华源
yum-config-manager \
    --add-repo \
    https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

4.安装

yum install docker-ce docker-ce-cli containerd.io

5.验证docker

docker --version

6.启动并且设置开机自启动

systemctl start docker
systemctl enable --now docker

并且最好配置好镜像加速器,防止网络原因导致的加载缓慢。

{
  "registry-mirrors": [
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
  ]
}

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。

类似于windows上的免安装软件,只需要有相关的文件就能够运行。并且修改了端口,可以直接再次运行一遍启动命令,同时开两个mysql。

docker配置完成了后,很方便的就能够把mysql安装好并且打开。

docker run -d \
  --name mysql \
  -p 3306:3306 \
  -e TZ=Asia/Shanghai \
  -e MYSQL_ROOT_PASSWORD=123 \
  mysql
//安装mysql

安装好mysql后,通过Navicat能够连接到这个位于我们云服务器上的数据库了。

命令

docker run命令中常见的参数:

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:代表着镜像名称结构

常用命令:

  • docker官方维护了docker hub,镜像仓库。我们只需要通过 docker pull 命令就可以拉取到上面的所有仓库
  • 并且可以通过 docker push 命令上传本地的镜像
  • 除了镜像仓库,还可以用本地的文件,通过docker build来完成构建镜像
  • 本地镜像通过docker save 能够提取文件,方便转移
  • 别的文件通过 docker load 能够加载到本地镜像
  • docker images 列出本地的镜像
  • docker rmi 删除本地镜像
  • docker run 创建并且运行一个容器
  • docker stop 停止一个正在运行的容器
  • docker start 开始运行一个容器(但是不重新创建)
  • docker logs 获取容器的日志输出
  • docker exec 可以执行一些命令,来进入到容器的内部
  • docker ps 列出当前正在运行的容器
  • docker rm 删除一个或者多个容器

命令别名

很多时候,docker中原始的操作会比较复杂,我们可以通过设置这些命令的一些别名的方式来简化,以后用这些简化的别名就能够运行这些命令。

通过  vi ~/.bashhrc可以打开这个文件

数据卷挂载

数据卷是一个虚拟目录,是容器内目录与宿主机之间映射的桥梁。

以nginx为例,在容器内,如果要修改添加文件到conf目录和html目录下,是很麻烦的。我们通过数据卷挂载,把容器里面的目录映射到linux中真实的目录中,这样修改、添加文件就很方便快捷了。

此时,操作宿主机相关的目录就等于操作容器中的目录。

关于数据卷的命令:

在执行docker run命令时,使用    -v 数据卷:容器内目录    可以完成数据卷挂载

当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

也就是说,只有在创建容器的时候才能够挂载数据卷。

此时,容器就创建好了,数据卷也完成挂载。

本地目录挂载

使用  -v 数据卷:容器内目录  可以完成数据卷挂载。

通过  -v 本地目录:容器内目录 可以完成本地目录挂载。

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

  • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫做mysql
  • -v ./mysql:/var/lib/mysql  会被识别为当前目录下的mysql目录

为什么要用本地目录挂载而不是数据卷呢?大体上还是数据卷隐藏的比较深,不方便管理。并且本地目录挂载和docker没有关系,不会因为docker受到影响,性能很高。

假设我们有一个mysql容器,把数据都挂在到本地目录后,只需要把这些文件拷贝就能够万和城呢个数据库的迁移和复制,很方便。

Dockerfile

对于上述镜像,都是官网提供给我们,我们在docker hub里面自己拉取到。但是实际应用场景中,我们可能需要自己部署自己的java应用到镜像中。

部署一个Java应用的步骤:

  1. 准备一个Linux服务器
  2. Ja
  3. 安装JRE并配置环境变量
  4. 拷贝
  5. r包
  6. 运行Jar包

但是呢,Linux服务器还需要配置,JRE环境变量也需要重新配置。这样做还不如重新构建一个Java镜像:

  1. 准备一个Linux运行环境
  2. 安装JRE并配置环境变量
  3. 拷贝Jar包
  4. 编写运行脚本

并且docker镜像结构是一层一层(Layer)的,每次添加安装包、依赖、配置等等都会形成新的一层。如果在拉取docker hub上的镜像的时候,发现有一层或者几层,本地主机上已经有了,就不会下载已经有的重复的层了,而是会下载没有的层级。

FROM

说明:指定基础镜像。
示例:FROM centos:6
ENV

说明:设置环境变量,可在后续指令中使用。
示例:ENV key value
COPY

说明:将本地文件拷贝到镜像的指定目录。
示例:COPY ./jre11.tar.gz /tmp
RUN

说明:执行 Linux 的 shell 命令,通常是安装过程中的命令。
示例:RUN tar -zxvf /tmp/jre11.tar.gz && export PATH=/tmp/jre11:$PATH
EXPOSE

说明:指定容器运行时监听的端口,是给镜像使用者看的。
示例:EXPOSE 8080
ENTRYPOINT

说明:镜像中应用的启动命令,容器运行时调用。
示例:ENTRYPOINT java -jar xx.jar

这就是指定的一个ubuntu镜像的Dockerfile文件,Dockerfile 是一个文本文件,它包含了一系列的指令,这些指令用于指定如何构建一个 Docker 镜像。

# 指定基础镜像
FROM ubuntu:16.04

# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin

# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar

# 安装JDK
RUN cd $JAVA_DIR && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144/ java8

# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/tmp/app.jar"]

但是我们需要的是一个java应用,很多java应用在jdk层面都是一样的,所以我们只需要在前几步用现成的就能够完成。

# 基础镜像
FROM openjdk:11.0-jre-buster

# 拷贝jar包
COPY docker-demo.jar /app.jar

# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

这个镜像帮我们把除了拷贝jar包之外的步骤都完成了。

当我们编写好了Dockerfile,用下面这个命令来构建镜像:

docker build -t myImage .
  • -t    这个选项用于给构建的镜像指定一个名称和标签(tag)。格式遵循 repository:tag 的格式。如果不指定标签,Docker 默认使用 latest 作为标签。

  •  .  这个点表示 Docker 应该在当前目录查找 Dockerfile 文件。如果 Dockerfile 位于当前执行命令的目录,就使用 . 作为参数。

加载自己项目的流程:

  1. 先把项目(docker-demo)、dockerfile和jdk.tar包导入linux中;
  2. 通过 docker load(本地镜像加载) 命令,加载jdk.tar包;
  3. 通过 docker build -t docker-demo(此处为自己取的名字) .
  4. 通过 docker run -d --name dd -p 端口号:端口号 docker-demo 命令,读取dockerfile文件,构建并且运行docker-demo

容器网络互联

默认情况下,宿主机内所有的容器都是通过bridge的方式连接在docker的一个虚拟网桥上的:

但是这种通过ip地址连接的方式并不是很好,如果被某个容器占用了,就需要重新分配并且解决冲突。更多情况下,会采用自定义网桥的方式,并且让需要的容器都加入到这个自定义网桥中。但是需要注意:如果容器加入了一个网桥后,是不能与处于另一个网桥的容器相互通信的,只有处在同一个网桥的情况下才能够进行容器间相互通信。

并且容器访问另一个容器用的可以是ip地址,也可以是容器名。不管ip地址怎么变化,容器名不变访问到的就是同一个容器。

并且容器默认构建的时候,会加入默认的bridge网桥。通过 --network  命令可以加入到其他网桥,这样的话就不会加入默认的bridge网桥了。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部