为什么用 Docker
容器的启动可以在秒级实现,比传统的虚拟机方式要快得多 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器 docker 的出现,让开发/测试/线上的环境部署,成为便利一条龙。
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、 个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外 一个。
对比
基本概念
Docker 镜像
Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的简易 centos操作系统环境,里面仅安装了 Apache 或 用户需要的其它应用程序。 镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接 从其他人那里下载一个已经做好的镜像来直接使用。
Docker 容器
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互 隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括 root 用户权限、进程空间、用户空 间和网络空间等)和运行在其中的应用程序。
Docker 仓库
仓库是集中存放镜像文件的场所。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这 样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
安装docker
卸载
1.查询安装过的包
yum list installed | grep docker
docker-engine.x86_64 17.03.0.ce-1.el7.centos @dockerrepo
2.删除安装的软件包
yum -y remove docker-engine.x86_64
3.删除镜像/容器等
rm -rf /var/lib/docker
安装
yum install –y docker ##默认安装
#docker-ce安装
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker- ce.repo
sudo yum install docker-ce
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
注:如果后续考虑K8S的情况时则要根据情况下载
验证成功与否
查看 docker 版本
docker version
docker info
启动 docker
systemctl start docker
systemctl enable docker
测试是否成功
docker run hello-world
Docker常规用法
docker操作
版本/信息— docker [info|version]
容器操作
容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
容器操作运维 — docker [ps|inspect|exec|logs|export|import|port]
容器rootfs命令 — docker [commit|cp|diff]
镜像操作
镜像管理 — docker [images|rmi|tag|build|history|save|import]
仓库操作
镜像仓库 — docker [login|pull|push|search]
简单仓库操作
docker search mysql 查询仓库中mysql的镜像
注:tag标签目前在网页上才能查看
docker pull hello-world 拉取镜像—类似于git 同理操作,但是没有加上标签,故 而是最后一个,如果加上标签则是找标签的
镜像操作
docker images
查询本地存在的镜像
docker rmi XX
删除某个镜像,XX可以是镜像ID ,也可以是名称
docker run --name XX -d xx
启动容器,一个XX表示启动后的名字,第二个XX表示用哪个镜像
,–name 表示名字 -d 后台运行
成功后,返回一个容器id
docker inspect XX 获取容器镜像元数据
复制挂载
docker exec -it nginx /bin/bash
把容器中的文件复制到宿主机的相对文件夹中
docker cp nginx:/usr/share/nginx/html /docker/nginx/
-v 是宿主目录挂载到容器目录,-p是宿主机端口号映射到容器端口上
docker run -d -p 8080:80 --name nginx1 -v /docker/nginx/html:/usr/share/nginx/html nginx
docker run -d -p 33306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=“root” mysql:5.7
-e 是指设置环境变量
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
standalone代表着单机模式运行,非集群模式
Docker版的Jenkins 安装
前提:宿主机存在 git maven jdk
拉取镜像
docker pull jenkins/jenkins:lts;
运行容器
docker run
-u root
–rm
-d
-p 8081:8080
-p 50000:50000
-v /var/run/docker.sock:/var/run/docker.sock
-v /opt/jdk1.8.0_201/bin/java:/opt/jdk1.8.0_201/bin/java
-v /opt/jdk1.8.0_201:/opt/jdk1.8.0_201
-v /home/apache-maven-3.6.1:/home/apache-maven-3.6.1
-v /var/jenkins_home:/var/jenkins_home
–name jenkins_mla jenkins/jenkins:lts
记住,要把jdk,git,maven挂载到容器中,否则后续配置有可能出错
启动服务端
Localhost:8081
因为是挂载故而直接
Cat /var/jenkins_home/secrets/initialAdminPassword,得到密码并粘贴过去
输入密码后
个人不建议安装推荐的插件(较多,耗时),可以选择安装
后续
创建新用户
下载插件
PS:可以下载个中文插件
之后开启新的项目 一般一开始有可能没有下载插件 所以没有maven 项目,故而需要下载插件Maven Integration plugin
以及 SSH 插件 后续用
配置Jenkins
为后续打包和远程调用使用
还有远程调用 SSH 用(系统设置-系统配置)
最后是gitlab,或者是hub 有资源,不然如何拉取代码
开始任务
前提(因此jenkins属于docker容器中的,故而很多Linux命令(宿主机)不能完全执行故而通过上面提到的远程SSH来执行sh脚本,进行对文件的进行docker镜像打包,发布容器,启动等)
下面一些简单操作,网上查询都有,就不重复叙述了,自己可以百度一下。
制作镜像
随后要有jdk,让项目运行起来 以及能让jar打包成镜像的Dockerfile
则先做一个jdk的镜像,通过Dokcerfile如下:
JDK
FROM centos:7
MAINTAINER malaian
新建目录
RUN mkdir /usr/local/java
将jdk文件拷贝到容器/usr/local/java/并解压
ADD jdk-8u201-linux-x64.tar.gz /usr/local/java/
软连接
RUN ln -s /usr/local/java/jdk1.8.0_201 /usr/local/java/jdk
设置环境变量
ENV JAVA_HOME /usr/local/java/jdk
ENV JRE_HOME
J
A
V
A
H
O
M
E
/
j
r
e
E
N
V
C
L
A
S
S
P
A
T
H
.
:
{JAVA_HOME}/jre ENV CLASSPATH .:
JAVAHOME/jreENVCLASSPATH.:{JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH
J
A
V
A
H
O
M
E
/
b
i
n
:
{JAVA_HOME}/bin:
JAVAHOME/bin:PATH
启动容器的DockerFile
###指定java8环境镜像
FROM jdk1.8
###复制文件到容器app-springboot
ADD cydl.jar cydl.jar
###声明启动端口号
EXPOSE 8080
###配置容器启动后执行的命令
ENTRYPOINT [“java”,"-jar",“cydl.jar”]
mysql
先配置docker版的mysql
docker run -d -p 33306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=“root” mysql:5.7
因为要考虑到连接数据库的问题,故而需要配置docker间的通用网络
配置网络
使用 docker network ls 查看下有哪些网络模式
这是docker默认的三种网络模式。创建一个新的网桥叫 my_bridge
docker network create -d bridge my_bridge
然后启动容器 绑定到my_bridge
docker network connect my_bridge mysql(容器name)
docker network connect my_bridge cydl(容器name)
备注:因改了通信了,故而项目中的连接IP也要改了
虽然上面映射的端口号是33306 但是容器通信还是不变的依然用3306
也可以使用link 单通信
这个是shell脚本命令
警告:如果出现什么\n\r报错的 是因为脚本是window环境下编写的,故而有回车换行的原因导致的,所以编辑器vi/vim打开你需要执行的脚本文件,输入 : set fileformat=unix 并回车,然后保存退出,重新执行脚本,问题就解决了。
脚本命令
#!/bin/bash
源jar路径 即jenkins构建后存放的路径
SOURCE_PATH=/var/jenkins_home/workspace
#docker 镜像/容器名字或者jar名字 这里都命名为这个
SERVER_NAME=cydl
BASE_PATH=/data/docker
#容器id
CID=
(
d
o
c
k
e
r
p
s
∣
g
r
e
p
"
(docker ps | grep "
(dockerps∣grep"SERVER_NAME" | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 1}̲') #镜像id IID=(docker images | grep “$SERVER_NAME” | awk ‘{print $3}’)
echo “最新构建代码
S
O
U
R
C
E
P
A
T
H
/
SOURCE_PATH/
SOURCEPATH/SERVER_NAME/target/cydl_test-1.0.jar 迁移至 $BASE_PATH …”
#把项目从jenkins构建后的目录移动到我们的项目目录下同时重命名下
mv /var/jenkins_home/workspace/cydl/target/cydl_test-1.0.jar /data/docker/cydl.jar
#修改文件的权限
chmod 777 /data/docker/cydl.jar
echo “迁移完成”
构建docker镜像
if [ -n "$IID" ]; then
echo "存在$SERVER_NAME镜像,IID=$IID"
docker stop $SERVER_NAME # 停止运行中的容器
docker rm $SERVER_NAME ##删除原来的容器
docker rmi $IID ## 删除原来的镜像
else
echo "不存在$SERVER_NAME镜像,开始构建镜像"
fi
构建镜像
cd /data/docker
docker build -t $SERVER_NAME .
运行容器
–name docker-test 容器的名字为docker-test
-d 容器后台运行
-p 8090:8090 指定容器映射的端口和主机对应的端口都为8090
-v /usr/local/dockerApp/blog-parent:/usr/local/dockerApp/blog-parent 将主机的/usr/local/dockerApp/blog-parent目录挂载到容器的/usr/local/dockerApp/blog-parent 目录中
docker run --name $SERVER_NAME -d -p 8090:8080
S
E
R
V
E
R
N
A
M
E
d
o
c
k
e
r
n
e
t
w
o
r
k
c
o
n
n
e
c
t
m
y
b
r
i
d
g
e
c
y
d
l
e
c
h
o
"
SERVER_NAME docker network connect my_bridge cydl echo "
SERVERNAMEdockernetworkconnectmybridgecydlecho"SERVER_NAME容器创建完成"
开始构建
连接优先条件:先要启动mysql容器并配置好网络连接
然后Jenkins开始构建
至此 通过docker+Jenkins一键部署搞定
建议
Jenkins和数据库不要放在docker容器中,
数据库
数据安全,性能
不要将数据储存在容器中,这也是 Docker 官方容器使用技巧中的一条。容器随时可以停止、或者删除。当容器被rm掉,容器里的数据将会丢失。为了避免数据丢失,用户可以使用数据卷挂载来存储数据。如果容器突然崩溃,数据库未正常关闭,可能会损坏数据。
另外,容器里共享数据卷组,对物理机硬件损伤也比较大。
对IO要求较高。当一台物理机跑多个时,IO就会累加,导致IO瓶颈,大大降低 MySQL 的读写性能。
但是:我们可以把数据丢失不敏感的业务(搜索、埋点)就可以数据化,利用数据库分片来来增加实例数,从而增加吞吐量。
docker适合跑轻量级或分布式数据库,当docker服务挂掉,会自动启动新容器,而不是继续重启容器服务。
Jenkins
基本原理同上,以及比如一些Linux相关命令等。