安装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应用的步骤:
- 准备一个Linux服务器
- Ja
- 安装JRE并配置环境变量
- 拷贝
- r包
- 运行Jar包
但是呢,Linux服务器还需要配置,JRE环境变量也需要重新配置。这样做还不如重新构建一个Java镜像:
- 准备一个Linux运行环境
- 安装JRE并配置环境变量
- 拷贝Jar包
- 编写运行脚本
并且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 位于当前执行命令的目录,就使用 . 作为参数。
加载自己项目的流程:
- 先把项目(docker-demo)、dockerfile和jdk.tar包导入linux中;
- 通过 docker load(本地镜像加载) 命令,加载jdk.tar包;
- 通过 docker build -t docker-demo(此处为自己取的名字) . ;
- 通过 docker run -d --name dd -p 端口号:端口号 docker-demo 命令,读取dockerfile文件,构建并且运行docker-demo
容器网络互联
默认情况下,宿主机内所有的容器都是通过bridge的方式连接在docker的一个虚拟网桥上的:
但是这种通过ip地址连接的方式并不是很好,如果被某个容器占用了,就需要重新分配并且解决冲突。更多情况下,会采用自定义网桥的方式,并且让需要的容器都加入到这个自定义网桥中。但是需要注意:如果容器加入了一个网桥后,是不能与处于另一个网桥的容器相互通信的,只有处在同一个网桥的情况下才能够进行容器间相互通信。
并且容器访问另一个容器用的可以是ip地址,也可以是容器名。不管ip地址怎么变化,容器名不变访问到的就是同一个容器。
并且容器默认构建的时候,会加入默认的bridge网桥。通过 --network 命令可以加入到其他网桥,这样的话就不会加入默认的bridge网桥了。