赞
踩
Docker操作手册
内容
五):容器启动后在宿主机内启动指定容器内应用(以feign1为例) 10
四. 根据容器创建可用镜像并导出,再部署到其他服务器... 11
五. 根据步骤四的镜像创建启动容器时自动启动应用(以feign2为例) 13
一):整合步骤二的Dockerfile内容根据步骤四的镜像重新创建Dockerfile. 13
1:一定要切换成root用户
sudo su –
输入密码:******
2:安装docker
更新每个软件包的最新信息,从而正确地下载最新版本的软件。
apt-get update
下载并安装docker
apt-get install docker.io
3:查看安装版本,可验证是否安装成功
docker -v
返回信息
docker version 20.10.7, build 20.10.7-0ubuntu5~20.04.2
4:登录(部分镜像下载需要登陆后才可,本示例中ubuntu镜像可不登陆直接下载)
docker login
根据提示数据用户名和密码
提示:docker镜像仓库地址:Docker Hub,未注册docker的可直接进行注册并查找镜像
返回部分信息
Login Succeeded
5:下载ubuntu作为基础镜像
docker pull ubuntu:20.04
返回部分信息
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04
6:查看已下载的镜像
docker images
返回信息
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 ba6acccedd29 3 weeks ago 72.8MB
1:上传JDK安装包
2:编写DockerFile(在JDK同级目录下编写Dockerfile文件)
使用touch 命令,创建Dockerfile,并编写脚本,脚本如下:
#!/bin/bash
# 使用Ubuntu作为基础镜像(如果本地不存在依赖镜像的时候会下载相应镜像)
FROM ubuntu:20.04
# 维护人信息
MAINTAINER panpan.qi
# 切换到usr/local 目录下
WORKDIR ./usr/local
# 创建jdk目录
RUN mkdir jdk
# 对jdk赋权
RUN chmod 777 /usr/local/jdk
# 将下载的jdk 的压缩包拷贝到镜像中,注意 ADD和COPY的区别,ADD 会解压,COPY不会解压, 注意:jdk*.tar.gz使用的是相对路径
ADD jdk-11.0.12_linux-x64_bin.tar.gz /usr/local/jdk
# 设置JAVA_HOME 的环境变量(如果不确定最后的JDK解压后的文件夹,可以先执行tar -zxvf jdk-11.0.12_linux-x64_bin.tar.gz,JDK安装包就会被解压,ll查看目录即可)
ENV JAVA_HOME=/usr/local/jdk/jdk-11.0.12
# 设置JAVA 环境
ENV CLASSPATH=$JAVA_HOME/bin:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
# 将java可执行文件设置到PATH中,这样就可以使用java命令了
ENV PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
# 向外暴露端口8088 ,这里只是演示,没有其他作用;
#EXPOSE 8088
# 容器启动自动启动shell脚本
# 此处可参考 步骤[五.根据步骤四的镜像创建启动容器时自动启动应用(以feign2为例)],进行容器启动时自动启动应用,但是暂时存在缺点,可去步骤五内查看。
# 也可不进行此处的设置,而是根据【三. 容器的创建和使用->五):容器启动后在宿主机内启动指定容器内应用(以feign1为例)】进行设置
COPY start.sh /root/start.sh
RUN chmod +x /root/start.sh
ENTRYPOINT cd /root; ./start.sh
# 执行java -version 命令
CMD ["java","-version"]
3:docker build -f Dockerfile -t jdk11:v1.0 .
-t jdk8:v1.0 给新构建的镜像取名为 jdk8, 并设定版本为 v1.0
注意最后有个点,代表使用当前路径的 Dockerfile 进行构建
返回部分信息
Successfully built 740c5aab4f3c
Successfully tagged jdk11:v1.0
4:查看已下载的镜像
docker images
返回信息
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk1102 v1.0 740c5aab4f3c 7 minutes ago 381MB
jdk11 v1.0 740c5aab4f3c 7 minutes ago 381MB
ubuntu 20.04 ba6acccedd29 3 weeks ago 72.8MB
5:删除多余镜像(因测试本地镜像创建,所以多运行了一次DockerFile,现删除多余镜像)
命令:docker rmi 镜像id
例:docker rmi 740c5aab4f3c
此时会报错:Error response from daemon: conflict: unable to delete 740c5aab4f3c (must be forced) - image is referenced in multiple repositories
表明有多个镜像的ID重复,此时可根据"REPOSITORY:TAR"进行删除
docker rmi jdk1102:v1.0
注意:本案例中已springCloud的eureka(注册中心)和feign为例,且可实现feign2调用feign1的功能
1:创建容器并绑定宿主机端口
方法一:(下面的步骤都按照该方法进行操作, 主要是容器的名称eurekahost)
docker run -dit --restart=unless-stopped --name eurekahost --net=host jdk11:v1.0 /bin/bash
方法二:
docker run -dit --restart=unless-stopped --name eurekanet -p 8700:8700 -p 8702:8702 -p 8703:8703 jdk11:v1.0 /bin/bash
命令解释:
-d 代表后台运行,
-it 表示可以交互,
--net 指定容器的网络模式(详细请百度)
host模式:使用 --net=host 指定。(直接使用宿主机网络,容器间直接即可相互调用)
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置。
container模式:使用 --net=container:NAME_or_ID 指定(指定当前创建容器与某个容器共享网络)
-p 为端口映射(将容器端口映射到宿主主机)
--restart=unless-stopped 在容器退出时总是重启容器,此方式在容器内ctrl+d退出后会重启容器,ctrl+p+q则仍旧正常运行容器
--name 指定容器名称
jdk11:v1.0 指定镜像的REPOSITORY和TAG
/bin/bash可以让容器不启动后立马就停止
2:查看容器状态
doker ps -a
-a:查看全部,不加-a,默认只查看已启动的容器
返回信息
3:复制jar包到容器内
文件拷贝命令
宿主机->容器:docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
容器->宿主机:docker cp 容器名:要拷贝到容器里面对应的路径 要拷贝的文件路径
docker cp /home/ubuntu/eureka.jar eurekahost:/tmp/
4:进入到容器内(执行此命令后用户会进入到容器内)
docker attach eurekahost
5:移动拷贝到容器内的jar包(jar包内指定了8700端口)到想要放置的目录下,并进入到该目录
cd /usr/local/
mkdir java
mv /tmp/eureka.jar java/
cd java/
6:运行jar包
nohup java -jar /usr/local/java/eureka.jar >/dev/null 2>&1 &
7:查看jar包运行状态
ps -ef|grep java
返回结果
8:退出容器(此命令会退出容器)
方法一:ctrl+d 退出后容器会默认关闭,但是创建容器时加了参数--restart=unless-stopped,所以容器会自动重启
方法二:ctrl+p+q 退出后容器正常运行,路径发生变化(强烈推荐)
9:确认宿主机与容器的jar端口进行了绑定
返回信息
10:查看宿主机IP
Ifconfig
11:根据宿主机IP在其他机器上进行端口访问测试
1:创建容器并绑定宿主机端口(如果需将应用日志挂载到宿主机,请参考:四):容器内的应用的日志挂载(以feign1为例))
方法一【配合 一):创建eureka的容器并使用 步骤1的方法一】:
docker run -dit --restart=unless-stopped --name feign1service2host --net=host jdk11:v1.0 /bin/bash
方法二【配合 一):创建eureka的容器并使用 步骤1的方法二】:
docker run -dit --restart=unless-stopped --name feign1service2net --net=container:eurekanet jdk11:v1.0 /bin/bash
2:重复上记一):创建eureka的容器并使用的2~8步骤,进行feign1service2的容器创建和使用
3:确认宿主机与容器的jar端口进行了绑定
wget http://localhost:8702/feign1/getList
返回信息
4:查看根据宿主机的eureka,会发现feign已成功注册
5:根据宿主机IP在其他机器上进行端口访问测试,可成功访问
http://192.168.91.129:8702/feign1/getList
1:根据【二):创建feign1的容器并使用】进行feign2的1~2创建和校验
2:确认宿主机与容器的jar端口进行了绑定
wget http://localhost:8703/feign2/getList
返回信息
3:查看根据宿主机的eureka,会发现feign已成功注册
4:根据宿主机IP在其他机器上进行端口访问测试,可成功访问(且该接口还调用了feign1的接口)
http://192.168.91.129:8703/feign2/getList
1:确认容器内的日志的路径
/datadisk/logs/te/feign1Service2/alog.log
2:在宿主机内创建对应的目录
mkdir /datadisk
cd / datadisk
mkdir /logs
3:复制feign1的日志文件路径到宿主机(需要提前知道路径才可)
docker cp feign1service2host:/datadisk/logs/te/feign1Service2 /datadisk/logs
注意:docker cp只能复制文件夹,而不能复制文件
4:创建容器,并挂载日志目录
docker run -dit --restart=unless-stopped -v /datadisk/logs/feign1Service2:/datadisk/logs/te/feign1Service2 --name feign1service2hostnew1 --net=host feign1service2host:v1.0 /bin/bash
5:进入容器feign1service2hostnew1,并启动应用feign1Service2
6:退出容器feign1service2hostnew1,在宿主机内tail查看挂载的目录下的日志,会发现日志正在逐行增加,日志挂载成功。
1:进入容器内,任意目录创建shell,例如:启动jar的脚本
docker attach feign1service2host
touch startjava.sh
vim startjava.sh
2:编辑shell,内容如下:
版本1:
#!/bin/bash
java -jar /usr/local/java/feign1Service2.jar
版本2:
#!/bin/bash
nohup java -jar /usr/local/java/feign1Service2.jar >/dev/null 2>&1 &
3:添加startjava.sh的执行权限,本示例直接给了777
chmod 777 startjava.sh
4:退出容器,在容器正常运行的情况下(即已经执行了docker start ****),执行以下命令
4-1:对应上记2的版本1(此版本可看到启动日志)
docker exec -it feign1service2host /bin/bash -c /etc/init.d/startjava.sh
4-1:对应上记2的版本2(此版本不可看到启动日志)
docker exec feign1service2host /bin/bash -c /etc/init.d/startjava.sh
5:查看
1:容器保存为镜像
docker commit 容器名 镜像名:TAG
docker commit eurekahost eurekahost
docker commit feign1service2host feign1service2host
docker commit feign2servicehost feign2servicehost
2:镜像查看
docker images
返回信息
3:镜像的保存
docker save eurekahost > eurekahost.tar
docker save feign1service2host > feign1service2host.tar
docker save feign2servicehost > feign2servicehost.tar
4:将上记步骤3的3个文件导出到其他服务器上
5:按照【一. 安装镜像】的1~3安装docker,已经安装请绕过
6:镜像的导入
docker load -i eurekahost.tar
docker load -i feign1service2host.tar
docker load -i feign2servicehost.tar
7:创建容器(以上记步骤6的eureka为例)
docker run -dit --restart=unless-stopped --name eurekahost --net=host eurekahost:latest /bin/bash
8:进入容器,并启动jar包
docker attach eurekahost
cd /usr/local/java/
nohup java -jar eureka.jar >/dev/null 2>&1 &
9:依次启动feign1,feign2的jar包,会发现未注册eureka成功
调查原因:是因为在feign1和feign2内写死了eureka的注册地址IP,将其修改为新服务器的IP即可
如果其他配置信息有变化,也要对应修改,比如数据库IP
改为
重新启动feign1和feign2的jar
正常注册及访问
备注:此方式暂时存在一个缺点,就是创建容器后,使用docker attach 容器后,不可交互
1:创建Dockerfile
touch Dockerfile
2:编辑Dockerfile,内容如下
3:创建对应的start.sh(与Dockerfile在同一目录),并编辑内容如下
#!/bin/bash
sleep 1
java -jar /usr/local/java/feign2Service.jar
1:创建镜像
docker build -f Dockerfile -t feign2servicehost:v1.2 .
2:创建并启动容器
docker run -dit --restart=unless-stopped --name feign2servicehost1 --net=host feign2servicehost:v1.2 /bin/bash
3:根据宿主机IP在其他机器上进行端口访问测试,可成功访问(且该接口还调用了feign1的接口)
http://192.168.91.130:8703/feign2/getList
1:下载redis和nginx镜像,并查看镜像
docker pull redis
docker pull nginx
1:创建nginx容器
docker run -dit --restart=unless-stopped --name nginx --net=host nginx /bin/bash
2:进入到nginx容器内
docker attach nginx
3:查看nginx默认配置
cd /etc/nignx
cat nginx.conf
可发现其默认加载的文件夹
4:进入到该文件夹,发现只有default.conf
5:查看default.conf,并添加如下内容
注意:如果vim命令无法使用,可先执行apt update && apt install vim
6:默认没有default.d文件夹,需创建
7:进入default.d文件夹,创建iExpense.conf文件
# proxy_pass 路径后
location ^~ /eureka {
proxy_pass http://127.0.0.1:8700/;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /feign1 {
proxy_pass http://127.0.0.1:8702;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ^~ /feign2 {
proxy_pass http://127.0.0.1:8703;
proxy_set_header Host $host;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
8:启动nginx
/usr/sbin/nginx >/dev/null 2>&1 &
备注:如果修改了配置文件可以进行reload :/usr/sbin/nginx -s reload &
9:根据宿主机IP在其他机器上进行nginx 的80端口访问测试,可成功访问
Nginx
Eureka
Feign1
Feign2
10:记录以下有用位置,便于修改和查看
启动nginx文件路径
/usr/sbin/nginx
default.conf配置文件的路径
/etc/nginx/conf.d/default.conf
新增个工程配置文件的路径
/etc/nginx/default.d/*.conf
默认首页文件夹html路径
/usr/share/nginx/html
日志文件路径
/var/log/nginx
1:创建redis容器
docker run -dit --restart=unless-stopped --name redis --net=host redis /bin/bash
2:进入redis容器,并启动
docker attach redis
redis-server >/dev/null 2>&1 &
3:查看启动是否成功
redis-cli
4:feign1Server2内添加redis设置在http://192.168.91.130/feign1/getList方法,并执行该方法
5:进入redis容器,启动redis-cli,查看feign1Service2设定的数据,会发现数据设定成功
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。