赞
踩
a. 在没有虚拟技术时,我们发布一个项目首先要有物理服务器,安装系统,在系统上启动运行项目
b. 在微服务环境下,一个项目我们可能会做集群,同一个项目复制多份,进行不同的配置,分别在不同的物理服务器上运行,然后基于nginx,网关等拦截请求负载均衡,将请求打到指定的服务器上
a. 成本比较高,可能一台服务器上,只能运行一个服务
b. 部署项目比较复杂,将不同的项目部署到不同的服务器上,需要进行大量的配置,发布时要获取指定的服务器,将指定的项目发布到指定的服务器
c. 扩展迁移成本比较大,假设后续需要迁移应用,或者当前服务集群不能承载当前的请求需要快速扩容,都会涉及到物理服务器的搭建,与项目的配置等等
- Host(Docker 宿主机),安装了Docker程序,也就是Docker 服务端
- Docker daemon 运行在Docker宿主机上的Docker程序的一个进程,通过该进程,客户端与服务端进行连接交互
- images 镜像,我们发布项目服务,一个服务需要环境配置,这个环境配置模板就相当于一个镜像,通过一个镜像可以创建多个容器,然后将在容器中运行项目
- Containers 容器: Docker根据一个镜像创建容器,容器与容器直接互不影响
- Docker Client 客户端: 也就是用户使用Docker时实际操作的部分,可以理解为一个命令行工具,连接Docker服务端,向服务端发送命令
- Registry 仓库服务注册,可以简单理解为一个存放项目代码的仓库,将镜像发布到该仓库中,后续通过该仓库获取镜像,库分为公开库与私有库,最大的向Docker Hub, 国内的向阿里云,时速云等等
//查看Linux 内核版本
uname -r
yum remove docker docker-common docker-selinux docker-engine
yum remove docker-ce
//卸载后将保留 /var/lib/docker 的内容(镜像、容器、存储卷和网络等)
rm -rf /var/lib/docker
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装前可查看device-mapper-persistent-data和lvm2是否已经安装
rpm -qa|grep device-mapper-persistent-data
rpm -qa|grep lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
//更改yum源地址
//1.切换到yum.repos.d 路径下,例如下方
cd /etc/yum.repos.d/
//2.ls 命令查看该路径下的文件
//3.打开 docker-ce.repo 文件
vim docker-ce.repo
//4.找到国内镜像网站,例如清华大学镜像站,该站中搜索docker,点击复制链接地址
//5.将doker-ce.repo文件中的所有https://download.docker.com/替换为复制的docker地址
//:%s@需要替换的数据@替换为的数据@ 替换完成后保存并退出
%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@
6. “vim docker-ce.repo"该命令执行后会进入文件中,点击:进入编辑模式, 输入上方的字符串”%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@“,然后进入ESC模式”:wq"保存退出即可
7. 更新yum软件包索引
yum makecache fast
//该命令是默认安装最新版本,实际开发中需要指定安装哪个版本
yum install docker-ce -y
#安装指定版本docker-ce可使用以下命令查看
yum list docker-ce.x86_64 --showduplicates | sort -r
# 安装完成之后可以使用命令查看
docker version
#安装 19.03.9版本docker控制台示例
yum install -y docker-ce-3:19.03.9-3.el7.x86_64 docker-ce-cli-3:19.03.9-3.el7.x86_64 containerd.io
#安装docker 19.03.9版本docker核心示例
yum install -y docker-ce-19.03.9-3 docker-ce-cli-19.03.9 containerd.io
注意如果没有找到"/etc/docker"目录,则执行"mkdir /etc/docker/"先创建该目录,然后创建 daemon.json
#填写自己的加速器地址
{
"registry-mirrors": ["https://加速器地址.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl start docker
1.查看系统是否安装完整vim执行一下命令:rpm -qa|grep vim
2. 如果已经正确安装的话,会显示如下三行:vim-enhanced-7.0.109-7.el5
vim-minimal-7.0.109-7.el5
vim-common-7.0.109-7.el5
- 如果少了其中的某一条,比如 vim-enhanced 的,执行安装命令: yum -y install vim-enhanced
- 如果上面的三条一条都沒有返回,执行安装命令: yum -y install vim*
yum -y install sudo
- 查找镜像命令: docker search 关键词
- 下载镜像命令(Tag表示版本,有些镜像的版本显示latest,为最新版本): docker pull 镜像名:TAG
- 查找镜像命令,会显示当前下载的所有镜像文件: docker images
- 删除指定本地镜像命令-f 表示强制删除: docker rmi -f 镜像ID或者镜像名:版本号
- 获取镜像的元信息,详细信息:docker inspect 镜像ID或者镜像名:TAG
- 查看指定镜像的元信息: docker inspect 镜像名称或ID
- 运行容器(如果本地镜像中没有默认会去仓库中拉取一个镜像运行): docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像ID或镜像名:TAG
–name 指定容器名,可自定义,不指定自动命名
-i 以交互模式运行容器
-t 分配一个伪终端,即命令行,通常-it组合来使用
-p 指定映射端口,当前Docker服务宿主机端口号:当前运行的容器端口号
-d 后台运行容器(是防止linux中运行了指定容器后,阻塞了当前窗口的操作)
-v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读
例如: # docker run --name 自定义容器名称 -d -p Docker宿主机端口2222:容器端口号8082 镜像名称或id,此时如果访问linux中2222端口号(注意该端口号是docker的),会自动访问8082端口- 容器列表:docker ps -a -q
-docker ps查看正在运行的容器
-a 查看所有容器(运行中、未运行)
-q 只查看容器的ID- 启动容器:docker start 容器ID或容器名
- 停止容器:docker stop 容器ID或容器名
- 删除容器-f 表示强制删除:docker rm -f 容器ID或容器名
- 查看日志:docker logs 容器ID或容器名
- 进入正在运行的容器并且开启交互模式终端:docker exec -it 容器ID或者容器名 /bin/bash,其中/bin/bash是固有写法,作用是因为docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash。也可以用docker exec在运行中的容器执行命令
- 拷贝文件:docker inspect 容器ID或容器名
//查看挂载目录(随机生成不可更改的)
docker container inspect 容器名称或id
//进去以后会显示一堆json数据,找到"Mounts" 里面的 "Source" 表示容器外部的挂载路径随机生成不可更改,里面的"Destination"是对应容器内部的挂载路径
//1.下载mysql镜像,指定5.7版本 docker pull mysql:5.7 //2.运行容器(如果没有下载会自动去下载) //注意点:在运行时由于mysql启动需要密码,比普通容器的运行多了"-e MYSQL_ROOT_PASSWORD=密码" docker run --name mysql-name -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root1234 mysql:5.7 //3.进入mysql-name容器中 docker container exec -it mysql-name /bin/bash //4.修改mysql配置文件,由于容器内部不支持某些命令,将文件拿到容器外更改 //5.在容器内部找到需要更改的配置文件 ls //查看容器下的文件夹 cd /etc/mysql/ //进入etc/mysql目录下 cd conf.d //通常mysql配置文件在etc/mysql/conf.d 文件夹下 //6.容器外部创建三个要挂载的目录 mkdir -p /my/mysql/conf mkdir -p /my/mysql/data mkdir -p /my/mysql/logs //7.进入容器内部依次复制文件到容器外部创建的目录中 docker cp mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /my/mysql/conf/ //8.容器外部依次修改挂载的文件 vi /my/mysql/conf/mysqld.conf character-set-server=utf8 //9.最终启动命令 docker run \ --name mysql \ -p 3306:3306 \ -v /my/mysql/conf:/etc/mysql/mysql.conf.d/ \ -v /my/mysql/data:/var/lib/mysql \ -v /my/mysql/logs:/logs \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
- 注册阿里云账号: https://dev.aliyun.com/
- 进入阿里云加速器页面,根据系统版本等信息获取对应的加速器地址: https://cr.console.aliyun.com/#/accelerator
- 复制对应地址粘贴到Docker–>setting–>docker Engine
//可用示例 { "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "experimental": false, "features": { "buildkit": true }, //镜像加速地址 "registry-mirrors": [ "https://epap466m.mirror.aliyuncs.com", "https://hub-mirror.c.163.com/" ] }
//-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务
docker run -itd --name redis-test -p 6379:6379 redis
docker ps -a # 查看所有容器
docker ps # 查看正在运行的容器
docker rm $(docker ps -a -q) #移除掉所有容器
docker restart container-id # 重启某个容器
docker exec -it redis-test /bin/bash
10. 本机连接测试
docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像名:TAG
# 例:
# docker commit -m="修改了首页" -a="ws" mytomcat ws/tomcat:v1.0
#使用新镜像运行容器
docker run --name tom -p 8080:8080 -d ws/tomcat:v1
//1.将SpringBoot项目打为jar包
//2.linux服务器上创建构建该项目的文件夹,用来存放构建该项目镜像时需要的文件,jar包等
mkdir dockerfiles //创建dockerfiles文件夹
//3.将打包好的SpringBoot项目jar包上传到创建的文件夹中
//4.该文件夹下创建Dockerfile文件,编写构建镜像指令
vim Dockerfile //注意点,如果不使用该名字,在构建时需要手动指定与当前创建的名字一致
#第一行命令必须是"FROM" #指定基础镜像,本地没有会从dockerHub pull下来 FROM java:8 #作者 MAINTAINER xxx作者名称 # 把可执行jar包复制到基础镜像的执行路径下,"/"后直接是项目名称表示上传到基础镜像的跟目录 ADD 当前项目名称.jar /上传到镜像后的项目名称.jar # 镜像要暴露的端口,如要使用端口,在执行docker run命令时使用-p生效 #端口号要与项目中的一致,可以设置传输协议,默认使用TCP,例如EXPOSE 80/tcp EXPOSE 80 # ENTRYPOINT 表示后续根据当前Dockerfile创建的镜像,根据该镜像创建容器后,默认执行的第一条命令 # 此处第一条命令时可以理解为 java -jar 指定jar项目,"/"后直接是项目.jar表示在基础镜像的根目录下查找该项目 ENTRYPOINT ["java","-jar","/项目名称.jar"] # 构建,不要忘了pro 后的".",表示上下文 docker build -t 构建的镜像名称 . # 根据当前创建的镜像生成容器 docker run --name 容器名称 -d -p 端口映射,容器端口:镜像(项目)暴露的端口 镜像名称或镜像id #启动容器后,查看容器日志,docker默认对日志进行了整合 docker logs 当前容器名称
构建镜像需要创建Dockerfile文件,文件中编写构建指令,然后Docker服务读取该文件根据指令进行构建
#如果当前容器中没有java镜像,会自动下载,":"后是指定基础镜像的版本
FROM java:8
FROM 镜像名称或id:镜像版本号
LABEL <作者名称>=<aaaa> <key>=<value> <key>=<value>...
#COPY 命令: # <src>:要复制的源文件或者目录,可以使用通配符 # <dest>:目标路径,即正在创建的image的文件系统路径;建议<dest>使用绝对路径, #否则COPY指令则以WORKDIR为其起始路径 COPY <src>...<dest> COPY ["<src>",..."<dest>"] 规则: <src> 必须是build上下文中的路径,不能是其父目录中的文件 如果 <src> 是目录,则其内部文件或子目录会被递归复制,但 <src> 目录自身不会被复制 如果指定了多个 <src> ,或在 <src> 中使用了通配符,则 <dest> 必须是一个目录,则必须以/符号结尾 如果 <dest> 不存在,将会被自动创建,包括其父目录路径 #ADD命令用法和COPY指令一样,ADD支持使用TAR文件和URL路径 ADD <src>...<dest> ADD ["<src>",..."<dest>"] 规则: 和COPY规则相同 如果 <src> 为URL并且 <dest> 没有以/结尾,则 <src> 指定的文件将被下载到 <dest> 如果 <src> 是一个本地系统上压缩格式的tar文件,它会展开成一个目录;但是通过URL获取的tar文件不会自动 展开 如果 <src> 有多个,直接或间接使用了通配符指定多个资源,则 <dest> 必须是目录并且以/结尾
WORKDIR /目录地址
VOLUME <mountpoint>
VOLUME ["<mountpoint>"]
#<protocol> 用于指定传输层协议,可以是TCP或者UDP,默认是TCP协议
#EXPOSE可以一次性指定多个端口,例如: EXPOSE 80/tcp 80/udp
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
#ENV 命令:
#第一种格式中, <key> 之后的所有内容都会被视为 <value> 的组成部分,所以一次只能设置一个变量
#第二种格式可以一次设置多个变量,如果 <value> 当中有空格可以使用\进行转义或者对 <value> 加引号进行标识;
另外\也可以用来续行
ENV <key> <value>
ENV <key>=<value>...
#ARG命令:
#指定一个变量,可以在docker build创建镜像的时候,使用 --build-arg <varname>=<value> 来指定参数
ARG <name>[=<default value>]
#例如通过RUN命令安装vim,容器中默认是不支持vim命令的,假设后续进入容器的操作中想要使用vim命令,可以在该命令,指定在build容器只执行下载安装vim
RUN yum install -y vim
第一种格式里面的参数一般是一个shell命令,以 /bin/sh -c 来运行它
第二种格式中的参数是一个JSON格式的数组,当中 <executable> 是要运行的命令,后面是传递给命令的选项或者
参数;但是这种格式不会用 /bin/sh -c 来发起,所以常见的shell操作像变量替换和通配符替换不会进行;如果你运
行的命令依赖shell特性,可以替换成类型以下的格式
RUN <command>
RUN ["<executable>","<param1>","<param2>"]
RUN ["/bin/bash","-c","<executable>","<param1>"]
RUN指令运行于镜像文件构建过程中,CMD则运行于基于Dockerfile构建出的新镜像文件启动为一个容器的时候
CMD指令的主要目的在于给启动的容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令可以被docker run的命令行选项给覆盖
Dockerfile中可以存在多个CMD指令,但是只有最后一个会生效
CMD <command>
CMD ["<executable>","<param1>","<param2>"]
CMD ["<param1>","<param2>"]
ENTRYPOINT启动的程序不会被docker run命令指定的参数所覆盖,而且,这些命令行参数会被当
做参数传递给ENTRYPOINT指定的程序(但是,docker run命令的–entrypoint参数可以覆盖ENTRYPOINT)
docker run命令传入的参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用,同样,Dockerfile中可以存在多个ENTRYPOINT指令,但是只有最后一个会生效
ENTRYPOINT 与 CMD 的区别是: 假设在执行"docker run 其它命令"时,CMD 命令会被run后面添加的命令覆盖掉,ENTRYPOINT 不会,如果两个命令同时存在,谁在最后谁生效
ENTRYPOINT<command>
ENTRYPOINT["<executable>","<param1>","<param2>"]
Dockerfile用来构建镜像文件,镜像文件也可以当成是基础镜像被另外一个Dockerfile用作FROM指令的参数,在后面这个Dockerfile中的FROM指令在构建过程中被执行的时候,会触发基础镜像里面的ONBUILD指令
ONBUILD不能自我嵌套,ONBUILD不会触发FROM和MAINTAINER指令
在ONBUILD指令中使用ADD和COPY要小心,因为新构建过程中的上下文在缺少指定的源文件的时候会失败
ONBUILD <instruction>
#1.FROM指令设置构建当前镜像使用的基础镜像 FROM centos:版本 #2.ADD命令解压Tomcat到/usr/local目录下(由于已经将文件上传到了指定的目录下所以ADD命令不需要再次复制了) ADD 上传上来的tomcat包 /usr/local #.ADD命令解压JDK ADD 上传上来的JDK包 /usr/local #3.ENV 命令配置JAVA_HOME环境变量示例, #也就是设置JAVA_HOME指向上传的JDK(主要上传的JDK包名与解压后的是否一致) ENV JAVA_HOME=/usr/local/解压后的JDK名称 #4.ENV 命令配置CLASSPATH,可以直接通过"$"方式使用上面通过ENV配置的JAVA_HOME, #连起来也就是配置CLASSPATH指向上传的JDK解压后的lib目录 ENV CLASSPATH=.$JAVA_HOME/lib #5.Env 命令配置tomcat的catalina ENV CATALINA_HOME=/user/local/上传的tomcat包解压后的名字 #6.将配置好的环境变量设置到contOS的path上 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin #7.使用WORKDIR WORKDIR $CATALINA_HOME #8.使用RUN命令,设置一个docker build容器时指定执行的命令 #此处用来安装一个vim,当根据当前镜像创建容器时,默认执行该命令,安装了一个vim指令 RUN yum install -y vim #9.使用EXPOSE命令设置当前镜像创建容器时对外暴露的端口(可以指定多个,指定连接协议等) EXPOSE 8080 #10.使用VOLUME命令,设置挂载目录,也就是指定容器中的指定目录下的文件会生成到宿主机上的对应的挂载目录 #例如当前: 在上面使用WORKDIR 指令设置了工作目录为CATALINA_HOME,在该目录下有一个webapp目录 #当容器运行时在该目录下创建或修改该目录下的文件,都会将文件的变动设置到当前Docker宿主机的对应挂载目录下 #也就是"Mounts"中的"Source"指向宿主机的目录 VOLUME /webapp #11.使用ENTRYPOINT命令,设置启动容器时执行的命令,此处设置启动容器时执行该命令启动Tomcat ENTRYPOINT ["catalina.sh","run"]
- 注意Centos 系统默认 ssh 连接端口是 22 ,在一些特定的条件中,22 端口被禁用或者被屏蔽,因而无法使用 22 端口进行 ssh 连接,此时把 22 端口映射为其他端口进行 ssh 连接、访问,参考博客
- 防止后续重启ssh报错问题
//启动centos容器,并指定容器名称为k8s-master,并指定把docker上centos的50001端口映射到本机50001端口
docker run -it --name k8sMaster -p 50001:22 --privileged=true centos:centos7 /usr/sbin/init
yum install net-tools.x86_64 -y
yum install -y openssh-server
# cd /etc/yum.repos.d/
# sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
# sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
# yum update -y
yum install passwd -y
#如果第一次安装passwod没有报错,执行设置root指令
passwd root
#如果第一次安装报错,提示已安装了,执行以下命令
passwd
systemctl restart sshd
Connecting to ip地址:端口号...
Could not connect to '172.26.64.1' (port 50001): Connection failed.
firewall-cmd --zone=public --add-port=80/tcp --permanent
sh: firewall-cmd: command not found
Unit firewalld.service could not be found.
yum install firewalld
systemctl start firewalld
systemctl stop firewalld
systemctl status firewalld
systemctl disable firewalld
systemctl enable firewalld
firewall-cmd --reload
firewall-cmd --query-port=80/tcp
firewall-cmd --list-port
//格式为:端口/通讯协议 permanent永久生效,没有此参数重启后失效
firewall-cmd --add-port=8080/tcp --permanent
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。