docker安装和使用

                                          

Docker操作手册

 

内容

一.        安装镜像... 1

二.        创建包含指定JDK的镜像... 2

三.        容器的创建和使用... 4

一):创建eureka的容器并使用... 4

二):创建feign1的容器并使用... 7

三):创建feign2的容器并使用... 8

四):容器内的应用的日志挂载(以feign1为例) 9

五):容器启动后在宿主机内启动指定容器内应用(以feign1为例) 10

四.        根据容器创建可用镜像并导出,再部署到其他服务器... 11

五.        根据步骤四的镜像创建启动容器时自动启动应用(以feign2为例) 13

一):整合步骤二的Dockerfile内容根据步骤四的镜像重新创建Dockerfile. 13

二):创建镜像并创建容器以及启动容器... 14

六.        Redis和Nginx容器的创建和使用... 14

一):镜像的下载... 14

二):创建nginx的容器并使用... 14

三):创建redis的容器并使用... 18

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

注意:本案例中已springCloudeureka(注册中心)feign为例,且可实现feign2调用feign1的功能

一):创建eureka的容器并使用

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端口进行了绑定

wget http://localhost:8700/

返回信息

10:查看宿主机IP

Ifconfig

11:根据宿主机IP在其他机器上进行端口访问测试

http://192.168.91.129:8700/

二):创建feign1的容器并使用

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

三):创建feign2的容器并使用

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

四):容器内的应用的日志挂载(以feign1为例)

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查看挂载的目录下的日志,会发现日志正在逐行增加,日志挂载成功。

五):容器启动后在宿主机内启动指定容器内应用(以feign1为例)

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 容器后,不可交互

一):整合步骤二的Dockerfile内容根据步骤四的镜像重新创建Dockerfile

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

  •  Redis和Nginx容器的创建和使用

一):镜像的下载

1:下载redis和nginx镜像,并查看镜像

docker pull redis

docker pull nginx

二):创建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

三):创建redis的容器并使用

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设定的数据,会发现数据设定成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值