Docker一次构建可放在任何地方运行,不需要进行任何改变,Docker就类似于一个容器。这个容器就好像常用的虚拟机一样,当我们虚拟机里面安装过VS、SQL、浏览器...之后咱们就把虚拟机镜像备份下来、等到下一次需要冲新搭一个环境的时候,就可以省去很多事情了,直接把备份的虚拟机运行起来,该有的就都有了,省去了很多事情。
在用Docker的情况下,我们可以直接把项目发布在Docker容器上面进行测试,当项目需要正式上线的时候,我们可以直接把做好的Docker镜像部署上去,如果测试的好,就不必担心项目上正式上线的时候出问题(比如Config配置信息,很多项目都是测试环境地址,正式环境地址,但是用过Docker之后就一个就行了)Docker可以在云、Windows、Linux等环境上进行部署,这一点就省去了很多费用、降低了项目部署上线的风险,不必每次项目上线都留守一堆人才等着项目报错。
我们写的代码会接触到好几个环境:开发环境、测试环境、以及生产环境等等。多种环境去部署同一份代码,由于环境原因往往会出翔软件跨环境迁移问题(也就是水土不服)
针对这种问题如何解决?我们可以将工程及此工程以来的所有软件打包到一个容器中统一部署
Docker可以运行在Mac、Windows、Centos、Ubuntu等操作系统上,ubuntu安装如下(官网: https://www.docker.com ):
# 1.unload原有的docker
sudo apt-get remove docker docker-engine docker-ce docker.io
sudo apt-get update
# 2. apt-get可以使用的https库
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 3. 添加docker的使用的公钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 4. 添加docker的远程库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
# 5. 安装docker-ce
sudo apt-get install -y docker-ce
# 6. 启动docker
systemctl status docker
# 7. 运行hello-world
sudo docker run hello-world
# 8. 查看docker版本,验证是否成功
docker -v
链接:https://www.jianshu.com/p/bafa48ebd55e
========================================普通用户=========================================
# 查看用户组及成员
sudo cat /etc/group | grep docker
# 可以添加docker组
sudo groupadd docker
# 添加用户到docker组
sudo gpasswd -a ${USER} docker
# 增加读写权限
sudo chmod a+rw /var/run/docker.sock
# 重启docker
sudo systemctl restart docker
sudo service docker restart
newgrp - docker
docker使用流程:
配置docker进程
从仓库下载镜像到宿主机
通过镜像创建容器并启动
默认情况下,从docker hub( https://hub.docker.com/ )上下载docker镜像,太慢。一般都会配置镜像加速器:
找到 阿里云-镜像加速服务
(1) 创建文件并配置
在linux中自己创建:/etc/docker/daemon.json文件,并导入镜像地址(二选一)
中科大镜像地址
{
"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
阿里云镜像地址
{
"registry-mirrors":["https://rydgq3cf.mirror.aliyuncs.com"]
}
(2) 重新启动docker
# 重启
syatemctl restart docker
# 查看docker信息
docker info
docker 进程:daemon(docker软件(服务))
# 启动docker服务
systemctl start docker
# 停止docker服务
systemctl stop docker
# 查看docker服务状态
systemctl status docker
# 设置开机启动docker服务:
systemctl enable docker
镜像:需要的软件(从仓库中下载(docker hub))
# 查看镜像
docker images
docker images -q # 查看所有镜像的id
# 搜索镜像:从网络中查找需要的镜像
docker search 镜像名称
# 拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。
docker pull 镜像名称
# 删除镜像:删除本地镜像
docker rmi 镜像id # 删除指定本地镜像
docker rmi $(docker images -q) # 删除所有本地镜像
容器:通过镜像启动的容器
# 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器
# 创建并启动容器
docker run 参数
# 交互式创建容器:创建并启动容器,进入容器内部,通过exit退出容器(关闭容器)
docker run -it --name=my_cs1 centos:7 /bin/bash
# 守护式创建容器:创建并后台启动容器,不会进入到容器内部
docker run -id --name=my_cs2 centos:7
# 交互式 docker run -it --name=my_c1 centos:7 /bin/bash
# 守护式 docker run -it --name=my_c2 centos:7
# 进入容器
docker exec -it 容器名称 /bin/bash # 退出容器,容器不会关闭
# 停止容器
docker stop 容器名称
# 启动容器
docker start 容器名称
# 删除容器
docker rm 容器名称
# 查看容器信息
docker inspect 容器名称
参数说明:
思考
什么是数据卷
数据卷是宿主机中的一个目录或文件,当容器目录和数据目录绑定后,对方的修改会立即同步,一个数据卷可以被多个容器同时挂在,一个容器也可以被挂在多个数据卷。
数据卷作用
容器数据持久化、外部机器和容器间接通信、容器之间数据交互
创建容器时,使用 -v 参数设置数据卷
# 启动容器,挂载数据卷
docker run ... -v 宿主机目录(文件):容器内目录(文件) ...
# 启动容器,挂载数据卷
docker run -id --name=my_c1 -v /home/data/:/usr/data/ centos:7
# 进入容器
docker exec -it my_c1 /bin/bash
# 查看共享文件,效果为双向绑定,且数据持久化
需求:在Docker容器中部署redis,并通过外部机器访问Redis
操作步骤:
# 搜索镜像
docker search redis
# 拉取镜像
docker pull redis
# 创建容器
docker run -id --name=my_redis -p 6379:6379 redis:5.0
参数解释:
-p: 设置映射端口,宿主据端口:容器端口
需求: 在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目
docker run -id --name=my_tomcat -p 8080:8080 tomcat
需求: 在Docker容器中部署Nginx,并通过外部机器访问Nginx
docker run -id --name=my_nginx -p 80:80 nginx
需求: 在Docker容器中部署Mysql,并通过外部mysql客户端(SQLyog)操作Mysql Server
docker run -id --name=my_mysql -p 3307:3306 -v /home/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7
dockerfile是用来构建docker镜像的文件!是命令参数脚本!
构建步骤:
很多官方镜像都是 基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
基础知识:
dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
Docker镜像逐渐成为企业交付的标准,我们必须掌握!
步骤:开发、部署、运维 缺一不可!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过 DockerFile 构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务器
以前我们是用别人的镜像,现在我们可以自己制作镜像了!
FROM # 基础镜像,一般从这里开始构建
MAINTAINER # 镜像是谁写的,姓名,邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩信息!添加内容
WOEKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定这个容器启动的时候要指令的命令,只有最后一个会生效,且可以被替代
ENTRYPOINT # 指定这个容器启动的时候要指令的命令,可追加命令
ONBUILD # 当构建一个被继承的 DockerFIle 这个时候就会运行 ONBUILD 的指令,触发指令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
Docker Hub 中,99%的镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行的构建。
创建一个自己的centos
# 1. 编写Dockerfile的文件
FROM centos
MAINTAINER caoshikui<shikuicao@163.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash
# 2. 通过这个文件构建镜像,最后的点一点不要忘记!!!!
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
Successfully built 54e21e6b766c
Successfully tagged my_centos:1.0
查看一个镜像的创建过程
docker history 镜像id
CMD 与 ENTRYPOINT 区别
CMD # 指定这个容器启动的时候要指令的命令,只有最后一个会生效,且可以被替代
ENTRYPOINT # 指定这个容器启动的时候要指令的命令,可追加命令
测试cmd
# 编写dockerfile文件
vim dockerfile-cmd-test
FROM centod
CMD ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-test -t cmdtest .
# run运行 发现我们的 ls -a 命令生效
docker run 镜像id
.
..
.dockerenv
bin
etc
home
lib
lib64
# 想追加一个命令 -l ls -al
docker run 镜像id -l 报错了
# 在cmd的情况下 -l 替换了CMD["ls","-a"] 命令, -l 不是命令所以报错!
测试ENTRYPOINT
# 编写dockerfile文件
vim dockerfile-cmd-entrypoint
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
# run运行 发现我们的 ls -a 命令生效
docker run 镜像id
.
..
.dockerenv
bin
etc
home
lib
lib64
# 想追加一个命令 -l ls -al ,追加的命令直接拼接在 ENTRYPOINT 的命令中
docker run 镜像id -l
成功运行!
Dockerfile中很多命令都十分的相似,我们需要了解他们的区别,最好的学习就是对比他们然后测试效果!
1、准备镜像文件 tomcat 压缩包、jdk 的压缩包
2、编写dockerfile文件,官方命名为 Dockerfile,build 会自动寻找这个文件,就不需要 -f 指定了
FROM centos
MAINTAINER caoshikui<shikuicao@163.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u271-linux-x64.tar.gz /usr/local/
ADD tomcat.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CLASSPATH_HOME /usr/local/apache-tomcat-9.0.41
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.41/bin/starup.sh && tail -F /usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out
3、 构建镜像
docker build -t tomcat-jdk:1.0
4、 启动镜像
Docker Hub
地址 https://hub.docker.com/ 注册自己的账号
确定这个账号可以登录
在我们服务器上提交自己的镜像
root@aliyun:/home# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
登录完毕后就可以提交镜像了,就是一步 docker push
修改镜像标签:docker tag 6ba49b7265f0 caoshikui/diytomcat:1.0
成功!
可以看到,提交的时候也是按照镜像层级提交的
1、 登录阿里云
2、 找到容器镜像服务
3、 创建命名空间
4、 创建镜像仓库
5、 浏览阿里云
按照提示步骤推送镜像到阿里云仓库即可
服务编排:批量管理所有容器
微服务建构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。
服务编排: 按照一定的业务规则批量管理容器
Docker Compose是要给编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤:
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
6.3.2 卸载 Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
创建 Docker-compose 目录
mkdir docker-compose
cd docker-compose
定义 docker-compose.yml 文件
version: ‘3‘
services:
nginx:
container_name: my_nginx
image: nginx
ports:
- 80:80
tomcat:
container_name: my_tomcat
image: tomcat
ports:
- 8080:8080
redis:
container_name: my_redis
image: redis
ports:
- 6379:6379
启动容器
docker-compose up -d
原文:https://www.cnblogs.com/caoshikui/p/14323639.html