Docker实战总结

Docker简介

一个项目,开发和上线两套环境,应用环境配置费时费力,而且容易出问题。为了解决这问题,所谓开发即运维,就是开发人员使用 Docker 来解决 “它在我的机器可以正常运行” 的问题,它会将运行程序的相关配置打包(打包成 一个镜像),然后直接搬移到新的机器上运行。从而保证系统稳定性,提高部署效率。

Docker的基本组成:

  • 镜像(image) :docker镜像就好比是个模板,可以通过这个模板来创建容器服务
  • 容器(container) :独立运行一个或者一个组应用通过镜像来创建的
  • 仓库(repository) :仓库就是存放镜像的地方

Docker安装

Docker官方建议在Ubuntu中安装,因为 Docker 是基于Ubuntu发布的,由于很多公司的环境都使用的是 CentOS ,如果安装到 CentOS 上,需要注意Docker 要求 CentOS 系统的内核版本高于 3.10 ,需要安装 64位 CentOS7.x 以上的版本。

查看当前系统的内核版本

uname -r

卸载旧版本

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

更新yum软件包索引

yum makecache fast

安装相关插件

yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

设置Docker的镜像仓库-使用阿里源

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

进行安装

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

安装最新版本的 Docker CE

yum install docker-ce
#安装中出现下面提示, 输入 y 然后回车

#安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io

启动与停止Docker服务

启动docker: systemctl start docker 
停止docker: systemctl stop docker 
重启docker: systemctl restart docker 
查看docker状态:systemctl status docker 
开机自动启动docker:systemctl enable docker
Docker帮助命令:docker --help

卸载Docker服务

卸载依赖  yum remove docker-ce docker-ce-cli containerd.io 
删除资源  rm -rf /var/lib/docker 
/var/lib/docker 是docker的默认工作路径!

配置国内镜像加速器

1、登录阿里云找到容器服务,搜索镜像服务,找到镜像加速器

Docker实战总结_第1张图片

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,如果不存在则手动创建,文件加入上面的地址内容。然后重启docker服务,

#重载此配置文件 systemctl daemon-reload 
#重启 docker systemctl restart docker

镜像命令

docker官网镜像搜索 : https://hub.docker.com

#查看所有本地主机上的镜像
docker images 

#搜索镜像
docker search 
#搜索出来的镜像就是STARS大于3000的mysql镜像
docker search mysql --filter=STARS=3000

#拉取镜像 (如果不写标签名,默认就是latest)
docker pull 镜像名:标签名

#删除镜像
docker rmi -f 镜像id 镜像id 镜像id 镜像id
#删除全部镜像
docker rmi `docker images -q`

容器命令

查看容器

#查看全部容器
docker ps -a
#查看正在运行容器:
docker ps
#查看停止的容器
docker ps -f status=exited

启动/停止/删除容器

#启动容器
docker start 容器id
#重启容器
docker restart 容器id 
#停止当前正在运行的容器
docker stop 容器id 
#强制停止当前容器
docker kill 容器id
#删除指定容器
docker rm 容器id 

退出容器

exit #容器直接退出
ctrl +P +Q #容器不停止退出

新建容器并启动

# 语法:docker run [OPTIONS] 镜像名:标签名
# 创建容器后,马上会启动容器,并进入容器
例子:docker run -it --name=容器名 镜像名:标签名 /bin/bash

# 数据目录挂载
docker run -id -v /宿主机绝对路径目录:/容器内目录 --name=容器名 镜像名
# 目录挂载只读(Read-only)权限
docker run -id -v /宿主机绝对路径目录:/容器内目录:ro --name=容器名 镜像名

创建守护式容器

# 创建一个守护式容器(后台运行的容器)
docker run -id --name=容器名 镜像名:标签名

登录容器

# 登录已经启动的容器方式
方式1 docker exec -it 容器id bashshell
方式2 docker exec -it 容器名称|容器id /bin/bash

拷贝宿主机与容器中的文件

# 将宿主机文件拷贝到容器内
docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目录
# 从容器内文件拷贝到宿主机
docker cp 容器名称:要拷贝的容器文件或目录 宿主机文件或目录
注意:文件拷贝 docker cp 命令 均在宿主机中操作

常用其他命令

# 查看容器中进程信息 ps
docker top 容器id
# 查看日志
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
# 查看镜像的元数据
docker inspect 容器id
# 查看容器IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
# 查看当前docker运行状态  (查看CPU状态)
docker stats

部署应用

部署 MySQL

# 拉取MySQL镜像
docker pull mysql:5.7

# 创建 MySQL 容器
docker run -id --name=my_mysql -p 33306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=密码 mysql:5.7
# -d 后台启动 -p 端口映射 -v 卷挂载 -e 环境变量 -name 容器名字

# 进入MySQL容器, 登陆MySQL
docker exec -it mxg_mysql /bin/bash

# docker exec -it mxg_mysql /bin/bash

# 登录Mysql
mysql -u root -p

部署 Nginx

# 拉取镜像
docker pull nginx

# 创建容器
docker run -d --name=nginx01 -p 3344:80 nginx

# 查看本机的状况
curl localhost:3344

# 进入容器,查看容器配置文件
whereis nginx

部署 Redis

docker pull redis
docker run -id --name=mxg_redis -p 6379:6379 redis

部署 tomcat

docker pull tomcat

# 创建容器
docker run -id --name=tomcat01 -p 9095:8080 -v /usr/project:/usr/local/tomcat/webapps --
privileged=true tomcat
步骤:--privileged=true 如果映射的是多级目录,防止有可能会出现没有权限的问题,
-v 映射目录:宿主机目录:容器映射目录

部署 es+kibana

docker pull elasticsearch

# 创建容器
docker run -id --name=elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
步骤:-e ES_JAVA_OPTS 增加内存限制64兆,最大是512兆

# 查看本机的状况
curl localhost:9200

镜像操作

提交一个镜像:

提交容器成为镜像
docker commit -m=“描述信息” -a="作者名字" 容器id 目标镜像名:[版本号]
例子:
docker commit -m=“描述” -a="yan" 7..容器ID tomcatNew:1.0

使用数据卷:

# -v  两个目录进行关联挂载
docker run -it -v 主机目录:容器内的目录

# 多个容器实现数据共享 ,创建第2个容器,引用之前创建好的容器名。
docker run --.... --volumes-form 其他容器名

Dockerfile

dockerfile 是用来构建docker镜像文件

步骤:

  1. 编写dockerfile 文件
  2. docker build 构建镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

体系结构:

  • FROM:基础镜像
  • MAINTAINER:镜像作者、邮箱
  • RUN:容器构建时需要运行的命令
  • WORKDIR:设置工作目录
  • ENV:设置环境变量 (可以写多条)
  • ADD:将宿主机的文件复制到容器内,如果是一个压缩文件, 将会在复制 后自动解压
  • COPY:和ADD相似,但是如果有压缩文件并不能解压
  • VOLUME:容器数据卷
  • CMD:可以有多个CMD,但只有最后一个会生效。在构建容器时,会被 docker run 后面指定的参数覆盖。
  • ENTRYPOINT:和CMD相似,但是并不会被docker run指定的参数覆盖,而是追加参数
  • ONBUILD:当创建一个被继承的Dockerfile,会被触发,触发器

例子:构建JDK镜像

# 来自基础镜像
FROM centos:7
# 指定镜像创建者信息
MAINTAINER goodyan
# 切换工作目录 /usr/local
WORKDIR /usr/local
# 创建一个存放jdk的路径
RUN mkdir /usr/local/java
# 安装vim插件
RUN yum -y install vim
# 将jdk压缩包复制并解压到容器中/usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
# 配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
CMD ["/bin/bash"]

构建镜像语法:

docker build -f / dockerfiel文件位置) -t 要生成的镜像名:[版本号] .
docker build -f /home/dockerdir/dockerfiel -t tomcatNew:1.0 .
# 查看是否构建成功
docker images

本地镜像发布到阿里云仓库

  • 登录阿里云
  • 找到容器镜像服务
  • 创建命名空间

将本地镜像推送到阿里云镜像仓库

# 1.登录阿里云Docker Registry, 密码为开通服务时设置的密码
docker login --username=用户名 registry.cn-xxx(每个人地址不一样)
# 2.标记此镜像为阿里云仓库的镜像
docker tag [镜像id] registry.cn-xxxx.xxx.com/xxx/jdk:[镜像版本号]
# 3.提交 
docker push 镜像名:[镜像版本号]

Docker部署

微服务打包Docker镜像

步骤1. 准备SpringBoot项目,进行打包
mvn package install

步骤2. 启动命令,进行测试是否启动成功
windows系统启动:java -jar xxx.jar
Linux系统启动:nohup java -jar xxx.jar

步骤3.创建dockerfiel文件,与jar包存在同一目录
dockerfiel文件内容:
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]

步骤4.上传服务器,构建镜像
docker build -f /home/xxx/dockerfiel文件地址(如果在当前目录可省略-f)-p 端口映射 -t 镜像名:1.0 .

步骤5.查看镜像
docker images

步骤6.运行启动镜像
docker run -id --name=容器名 镜像名:标签名
或 docker run -d --name 容器名 -p 端口外:端口内 镜像名:标签名

IDEA集成Docker实现打包

步骤1:修改docker服务配置文件

# 修改配置文件
vim /lib/systemd/system/docker.service
# 修改内容
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
(修改ExecStart那行,并开启2375端口,0.0.0.0代表任何ip都可以访问)

# 重新加载配置文件
systemctl daemon-reload
# 重启docker
systemctl restart docker.service
# 查看端口是否开启
netstar -nlpt   # 如果没有这个命令,安装插件 yum install net-tools
# 关闭防火墙 / 开发端口号的防火墙
firewall-cmd --list-ports # 查看
firewall-cmd --zone=public --add-port=2375/tcp --permanent # 设置
firewall-cmd --reload     # 重启

步骤2:IDEA工具配置连接Docker

Docker实战总结_第2张图片

步骤3:使用 docker-maven-plugin插件 ,实现自动化部署

修改pop.xml文件


      com.spotify
      docker-maven-plugin
      1.0.0
      
          
          ${docker.image.prefix}/${project.artifactId}
          
              latest

          
          java
          [email protected]
          /ROOT
          ["java", "-version"]
          ["java", "-jar", "${project.build.finalName}.jar"]
	      
          http://123.56.94.235:2375
          
          
              
                /ROOT
                ${project.build.directory}
                ${project.build.finalName}.jar
              
          
       

然后我们执行打包命令,就在Docker服务生成镜像

mvn clean package docker:build

步骤4:打包自动化,自动化部署


                    

你可能感兴趣的:(docker)