史上最详细的docker学习手册,请查收!

通过镜像创建容器,通过docker run命令创建。

  • 容器的作用

容器起到了隔离的作用,独享空间、网络等等。

  • doker命令

docker run --help

-d, --detach=false 指定容器运行于前台还是后台,默认为false

-i, --interactive=false 打开STDIN,用于控制台交互

-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false

-u, --user=“” 指定容器的用户

-a, --attach=[] 登录容器(必须是以docker run -d启动的容器)

-w, --workdir=“” 指定容器的工作目录

-c, --cpu-shares=0 设置容器CPU权重,在CPU共享场景使用

-e, --env=[] 指定环境变量,容器中可以使用该环境变量

-m, --memory=“” 指定容器的内存上限

-P, --publish-all=false 指定容器暴露的端口

-p, --publish=[] 指定容器暴露的端口

-h, --hostname=“” 指定容器的主机名

-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录

–volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录

–cap-add=[] 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities

–cap-drop=[] 删除权限,权限清单详见:http://linux.die.net/man/7/capabilities

–cidfile=“” 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法

–cpuset=“” 设置容器可以使用哪些CPU,此参数可以用来容器独占CPU

–device=[] 添加主机设备给容器,相当于设备直通

–dns=[] 指定容器的dns服务器

–dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件

–entrypoint=“” 覆盖image的入口点

–env-file=[] 指定环境变量文件,文件格式为每行一个环境变量

–expose=[] 指定容器暴露的端口,即修改镜像的暴露端口

–link=[] 指定容器间的关联,使用其他容器的IP、env等信息

–lxc-conf=[] 指定容器的配置文件,只有在指定–exec-driver=lxc时使用

–name=“” 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字

–net=“bridge” 容器网络设置:

bridge 使用docker daemon指定的网桥

host //容器使用主机的网络

container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源

none 容器使用自己的网络(类似–net=bridge),但是不进行配置

–privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities

–restart=“no” 指定容器停止后的重启策略:

no:容器退出时不重启

on-failure:容器故障退出(返回值非零)时重启

always:容器退出时总是重启

–rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)

–sig-proxy=true 设置由代理接受并处理信号,但是SIGCHLD、SIGSTOP和SIGKILL不能被代理

  • docker创建示例

docker run -d -p 5000:5000 \

–restart=always \

–privileged=true \

–name=registry-local-jackly \

-v /date/volume/registry:/var/lib/registry \

registry

  • docker常用命令

#查看正在运行的容器

docker ps

#查看所有的容器(包括已经停止的容器)

docker ps -a

#停止容器

docker stop 容器ID

#强制停止容器

docker kill 容器ID

#启动容器

docker start 容器ID

#重启容器

docker restart 容器ID

#删除已经停止的容器

docker rm 容器ID

#删除正在运行的容器,强制删除

docker rm -f 容器ID

2、如何进入容器内部

  • 进入容器的方式

有4种方式能进入容器,分别为 exec、docker attach、ssh、nsenter. 这4种都能进入容器,但是最好用最常用的是exec

  • exec命令

docker exec --help

-d 以后台方式执行,这样,我们执行完这条命令,还可以干其他事情,写脚本最常用

-e 代表环境变量

-i 以交互方式运行,是阻塞式的

-t 分配一个伪终端,这个参数通常与-i参数一起使用,然后在后面跟上容器里的/bin/bash,这样就把我们带到容器里去了。

-u 指定进入的容器以哪个用户登陆,默认是root

  • 进入容器命令

#启动镜像,若镜像容器已经创建,则通过docker ps -a查询停止的容器id,在通过docker start 容器ID 启动容器

docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0

#进入容器的相关命令

docker exec -it eureka sh

#进入后可以使用ls查看目录(/app/service/eureka/data/app.jar)

docker exec -it eureka /bin/bash

docker exec -it eureka pwd

docker exec -it eureka top

3、容器内容改变后,能否重新生成镜像

  • 使用ll命令验证

①、进入容器: docker exec -it eureka /bin/bash

②、修改容器内容:echo “alias ll=‘ls -l’” >> ~/.bashrc && source ~/.bashrc

③、验证ll命令:ll

④、强制删除容器:docker rm -f 容器ID

⑤、启动镜像容器:docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:1.0.0

⑥、进入容器使用ll命令:发现先前修改的实效

  • 修改容器后,重新生成镜像

①、进入容器: docker exec -it eureka /bin/bash

②、修改容器内容:echo “alias ll=‘ls -l’” >> ~/.bashrc && source ~/.bashrc

③、验证ll命令:ll

#生成镜像命令

docker commit --help

-a 用来指定作者

-c 使用Dockerfile指令来创建镜像

-m 描述我们此次创建image的信息

-p 在commit时,将容器暂停

④、重新生成镜像

docker commit -m=“add ll” --author=“jackly” eureka registry-jackly/eureka-server:2.0.0

⑤、启动新镜像

docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0

五、网络管理


1、外部网络如何访问容器应用

  • 外部访问容器应用,是通过端口来实现的

#参数-p,指定端口,其中 8080是宿主机的端口,80是容器的端口

docker run -d -p 8080:80 nginx

#参数-P(大写),随机端口,随机范围 32769-60999

docker run -d -P nginx

  • dockerfile的端口实现规则

(1)有开放 EXPOSE 8761

#参数-p,指定端口

docker run -d -p 8761:8761 --name=eureka registry-agan/eureka-server:1.0.0

#参数-P,随机端口( 达到的效果是0.0.0.0:32771->8761)

docker run -d -P --name=eureka registry-jackly/eureka-server:2.0.0

(2)没有开放 EXPOSE 8761

#参数-p,指定端口(效果:正常)

docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0

#参数-P,随机端口( 达到的效果是,无端口号,连内部容器都没有端口)

docker run -d -P --name=eureka registry-jackly/eureka-server:2.0.0

2、如何实现容器之间的网络通信

  • 业务场景为4个容器

mysql、eureka、product、config

  • 安装mysql

#启动mysql容器

docker run -p 3306:3306 --name mysql \

-e MYSQL_ROOT_PASSWORD=agan \

-d mysql:5.7

#进入mysql容器

docker exec -it mysql /bin/bash

#docker镜像没有ifconfig、ping指令

apt-get update

apt install net-tools # ifconfig

apt install iputils-ping # ping

  • 创建eureka容器

docker run -d -p 8761:8761 --name=eureka registry-jackly/eureka-server:2.0.0

  • 部署config镜像和容器(加入config有问题,暂时未找到原因)

dockerfile:

#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8

FROM java:8

#2.维护者:格式:MAINTAINER

MAINTAINER jackly

#3.镜像的操作指令

ADD拷贝一个文件到容器中,格式:ADD

ADD config-server-0.0.1-SNAPSHOT.jar /app/service/config/data/app.jar

#5.配置容器启动后,执行什么命令

ENTRYPOINT [“java”,“-jar”,“/app/service/config/data/app.jar”]

构建镜像

#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号

#注意:其中 .号,代表当前目录下的dockerfile文件

docker build -t registry-jackly/config-server:1.0.0 .

创建容器

#查看本地镜像

docker images

#启动镜像 link eureka:jacklyureka==>link 容器名称:别名(将配置中心服务注册到eureka)

docker run -d -p 9030:9030 --name config \

–link eureka:jacklyureka \

registry-jackly/config-server:1.0.0

#查看config信息

http://172.31.65.26:9030/e-book-product/deauflt

进入config容器

​ 查看eureka注册信息

image-20210525191402881

  • 部署product镜像和容器

dockerfile:

#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8

FROM java:8

#2.维护者:格式:MAINTAINER

MAINTAINER jackly

#3.镜像的操作指令

ADD拷贝一个文件到容器中,格式:ADD

ADD e-book-product-core-0.0.1-SNAPSHOT.jar /app/service/product/data/app.jar

#5.配置容器启动后,执行什么命令

ENTRYPOINT [“java”,“-jar”,“/app/service/product/data/app.jar”]

构建镜像

#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号

#注意:其中 .号,代表当前目录下的dockerfile文件

docker build -t registry-jackly/product-server:1.0.0 .

创建容器

#查看本地镜像

docker images

#启动镜像 注:link就是容器直接的连接,你不用IP的情况下可以通过link来实现容器名之间的通信;它的语法是 link 容器名:别名

docker run -d -p 8083:8083 --name product \

–link mysql:jacklymysql \

–link eureka:jacklyeureka \

registry-jackly/product-server:1.0.0

#验证效果

http://172.31.65.26:8761/

http://172.31.65.26:8083/product/findAllProduct

link原理

#原理就是在prodct容器中的hosts加了2条记录。

docker exec -it product /bin/bash

cat /etc/hosts

六、数据管理


1、docker容器的数据如何共享给宿主机

  • 宿主机查看eureka日志

1)使用docker run volume方式实现

#构建镜像

docker build -t registry-jackly/eureka-server:2.0.0 .

#创建容器

#就是把docker的数据保存到宿主机的磁盘中,通常说的就是挂载点,或者叫做卷。

#语法: -v 宿主机目录:容器目录

docker run -d -p 8761:8761 --name=eureka \

–privileged=true \

-v /app/service/eureka/logs:/opt/data \

registry-jackly/eureka-server:2.0.0

2)使用dokcerfile方式实现

#1.基础镜像:FROM指令:基础镜像名:tag,例如java:8

FROM java:8

#2.维护者:格式:MAINTAINER

MAINTAINER jackly

#3.加入挂载点

VOLUME /opt/data

#4.镜像的操作指令

ADD拷贝一个文件到容器中,格式:ADD

ADD eureka-server-0.0.1-SNAPSHOT.jar /app/service/eureka/data/app.jar

#5.告诉docker容器暴露端口,在容器启动的时候,需要通过-p 做端口映射

EXPOSE 8761

#6.配置容器启动后,执行什么命令

ENTRYPOINT [“java”,“-jar”,“/app/service/eureka/data/app.jar”]

#重新构建eureka

docker build -t registry-jackly/eureka-server:3.0.0 .

#创建容器

docker run -d -p 8761:8761 --name=eureka \

–privileged=true \

registry-jackly/eureka-server:3.0.0

注意点:dockerfile volume 无法指定宿主机的目录,都是自动生成,而且是随机的;默认在/var/lib/docker/volumes/。

(为什么是随机生成?因为dockerfile无法确定每台宿主机是否都存在目录)

#如何找到宿主机的挂载目录?

docker inspect eureka

#信息段

“Mounts”: [

{

“Type”: “volume”,

“Name”: “cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669”,

“Source”: “/var/lib/docker/volumes/cf527694ebafb92426a52f1916b26832b4c8977093083450a96fbccb3d866669/_data”,

“Destination”: “/opt/data”,

“Driver”: “local”,

“Mode”: “”,

“RW”: true,

“Propagation”: “”

}

  • 总结

docker run 是能指定宿主机的目录。

dockerfile volume 无法指定宿主机的目录,都是自动生成,而且是随机的;默认在/var/lib/docker/volumes/。

2、宿主机如何直接维护docker容器的数据

在没有使用-v挂载点时,创建的容器,在容器删除后,根据镜像重新生成容器后,数据也随之流失。如果使用了挂载点,删除容器后,在根据镜像生成容器,数据还会保留。

docker run -p 3306:3306 --name mysql \

-e MYSQL_ROOT_PASSWORD=agan \

–privileged=true \

-v /app/data/mysql:/var/lib/mysql \

-d mysql:5.7

image-20210526143850520

七、镜像仓库管理系统搭建


搭建一个镜像仓库管理系统需要3个步骤,分别是:生成一个认证文件,rsa的认证文件;创建一个仓库容器;创建一个仓库web管理系统

  • 生成一个认证文件,rsa的认证文件

#建立/app/registry-jackly/conf,在/app/registry-jackly目录下执行 以下命令:

openssl req -new -newkey rsa:4096 -days 365 -subj “/CN=localhost” -nodes -x509 -keyout conf/auth.key -out conf/auth.cert

  • 创建一个仓库容器

#创建配置文件/app/registry-jackly/conf/registry-jackly.yml

version: 0.1

#镜像存储地方

storage:

filesystem:

rootdirectory: /var/lib/registry

#镜像的删除权限,enabled: true代表开启删除权限

delete:

enabled: true

log:

level: info

#开启仓库的网络,端口号为5000

http:

addr: 0.0.0.0:5000

#创建仓库命令

docker run \

-v /app/registry-jackly/conf/registry-jackly.yml:/etc/docker/registry/config.yml:ro \

-v /app/registry-jackly/conf/auth.cert:/etc/docker/registry/auth.cert:ro \

-p 5000:5000 --name registry-docker -d \

–privileged=true \

registry

  • 创建一个仓库web管理系统

#创建一个配置文件:/app/registry-jackly/conf/registry-web.yml

registry:

指定registry的地址(注意:registry-docker为仓库的容器名字)

url: http://registry-docker:5000/v2

#仓库的名称(注意:registry-docker为仓库的容器名字)

name: registry-docker:5000

#是否为只读模式,设置true时,不允许删除镜像

readonly: false

#权限验证

auth:

#是否开启验证

enabled: true

#验证证书的key

key: /conf/auth.key

#证书颁发者的名称

issuer: docker

#创建仓库web管理系统命令(注意:–link registry-docker很重要,没有的话,无法连接仓库。)

docker run \

-v /app/registry-jackly/conf/registry-web.yml:/conf/config.yml:ro \

-v /app/registry-jackly/conf/auth.key:/conf/auth.key \

-v /app/registry-jackly/db:/data \

-d -p 8080:8080 --link registry-docker --name registry-web \

–privileged=true \

hyper/docker-registry-web

  • 效果验证

#登录仓库管理系统

http://172.31.65.26:8080/login/auth

用户名=admin

密码 =admin

#构建镜像

#其中 -t 对镜像进行命名,一般的命名法:仓库名字/镜像名字:版本号

#注意:其中 .号,代表当前目录下的dockerfile文件

docker build -t registry-docker:5000/eureka-server:3.0.0 .

#修改hosts(vi /etc/hosts)

127.0.0.1 registry-docker

#给搭建好的仓库加个镜像

docker push registry-docker:5000/eureka-server:3.0.0

#权限设置

默认admin用户是没有删除权限,需要重新创建用户,并且给予权限。

八、maven构建springcloud镜像


​ 在先前构建项目时,先通过maven打包出jar,在手动上传到虚拟机上,并编写dockerfile文件,在使用docker build命令构建镜像,比较繁琐。实际上可以通过maven来直接构建springcloud镜像,maven构建springcloud镜像推送给仓库,需要2步骤:开启docker远程API;编写maven的docker插件。

  • 开启docker远程API

image-20210527105727120

#在配置文件中,加入:-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

vi /usr/lib/systemd/system/docker.service

#重启docker

systemctl daemon-reload

systemctl restart docker

#验证docker远程api是否生效

netstat -anp|grep 2375

curl 127.0.0.1:2375/info

  • 编写maven的docker插件

#本地配置hosts(c:\windows\system32\drivers\etc)

172.31.65.26 registry-docker

#docker maven插件

org.springframework.boot

spring-boot-maven-plugin

com.spotify

docker-maven-plugin

1.1.1

registry-docker:5000

http://registry-docker:2375

registry-docker:5000/ p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version}

java:8

[“java”, “-jar”, “/${project.build.finalName}.jar”]

${project.version}

latest

true

true

/

${project.build.directory}

${project.build.finalName}.jar

#执行命令

clean package -DskipTests docker:build

  • 验证效果

image-20210527125534197

九、编排构建springcloud实例


  • 什么是compose为什么要使用compose

​ 因为运行一个docker镜像,通常是需要docker run 命令,在运行镜像的时候还需要一定的参数 ;例如 容器的名称 映射的卷,绑定端口等等,非常麻烦。那如果有个一个文件来记录保存这些命令该多好? 所以compose就是用于存储这些命令,而且呢是比docker run还要简单存储。那compose是什么呢? 它既是一个yaml格式的文件,例如docker-compose.yml文件。

#安装最新compose

curl -L https://get.daocloud.io/docker/compose/releases/download/1.21.2/docker-compose-uname -s-uname -m > /usr/local/bin/docker-compose

#添加可执行权限

chmod +x /usr/local/bin/docker-compose

#测试安装结果

docker-compose --version

  • 自动构建spring cloud注册中心eureka

创建一个网络

创建命令:docker network create dockernet

查看命令:docker network ls

compose内容:

#docker compse 的配置文件包含3大部分:version services networks

version: ‘3’

services:

服务名称

eureka:

容器名称

container_name: eureka

镜像名称

image: registry-docker:5000/eureka-server:0.0.1-SNAPSHOT

暴露的端口号

ports:

  • “8761:8761”

设置卷挂载的路径 /opt/data代表的是日志存储路径

volumes:

  • /app/service/eureka/logs:/opt/data

设置权限 :拥有root权限

privileged: true

networks:

  • default

networks:

default:

external:

name: dockernet

运行命令

docker-compose -f docker-compose-eureka.yml up -d

演示效果

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

image

docker-compose

#测试安装结果

docker-compose --version

  • 自动构建spring cloud注册中心eureka

创建一个网络

创建命令:docker network create dockernet

查看命令:docker network ls

compose内容:

#docker compse 的配置文件包含3大部分:version services networks

version: ‘3’

services:

服务名称

eureka:

容器名称

container_name: eureka

镜像名称

image: registry-docker:5000/eureka-server:0.0.1-SNAPSHOT

暴露的端口号

ports:

  • “8761:8761”

设置卷挂载的路径 /opt/data代表的是日志存储路径

volumes:

  • /app/service/eureka/logs:/opt/data

设置权限 :拥有root权限

privileged: true

networks:

  • default

networks:

default:

external:

name: dockernet

运行命令

docker-compose -f docker-compose-eureka.yml up -d

演示效果

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-HDaW3ZeX-1710752402057)]
[外链图片转存中…(img-vf2yw2Ck-1710752402058)]
[外链图片转存中…(img-HEexUtnD-1710752402058)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-hTa9PnCa-1710752402059)]

最后

终极手撕架构师的学习笔记:分布式+微服务+开源框架+性能优化

[外链图片转存中…(img-0cuq9hmI-1710752402059)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值