day00-容器
大纲
第一章:容器技术概述
第二章:docker容器引擎的安装部署
第三章:docker的镜像管理
第四章:docker的基本操作
第五章:docker的高级操作
第六章:docker file详解
第七章:综合实验
第八章:docker的网络模型
第一章:容器技术概述
容器本质是承东西+做隔离
pid=1的进程是init的进程
进程没有做到隔离,希望做到隔离,互不影响(借助容器思维)
可以用虚拟化技术解决这个隔离问题,但是开销要大一些
容器引擎
1.1 应用与应用的隔离(应用的容器化封装)
依赖namespace资源隔离技术(以下6个维度的隔离技术)
pid,在各自的容器中可以相同的编号
网络设备,协议栈都是隔离的,在自己的容器中可以是相同的端口号,相同网卡编号
IPC,进程之间的通信,隔离的2个进程要通信,怎么做?共享内存,共享消息队列
mount,文件系统,各自独立的文件系统,独立的根
uts,有自己的主机名和主机域
user,操作系统进程的用户和用户组,相互隔离(内核3.8以上才实现)
1.2 chroot(1979年)
切根,实现了2个应用程序在文件系统上是隔离的
1.3 cgroups(2007年)
操作系统内核,控制你可以使用独立的cpu资源,内存资源,文件系统资源
1.4 lxc(2008年)
容器在生产上
1.5 docker(2013年)
一统容器发展的优势,简单,快捷,高效,便捷,统一
docker基于容器技术,轻量级虚拟化解决方案,完美实现了以上6个维度的隔离
docker是一个引擎,把linux的namespace,cgroup等底层技术封装抽象,为用户提供了创建和管理容器的便捷命令行和api。docker是基于go语言,封装了namespace和cgroup技术
对比
第二章:docker引擎的安装部署
EE及CE,2个版,一个企业版,一个社区版
2.1 环境准备
准备centos7.6的虚拟机
内核版本要保证在3.10以上,
genenforce保持关闭
systemctl stop firewalld
外网可以ping通,yum的epel源配置好
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release -y
yum install -y yum-utils
yum list docker --show-duplicates
epel源中有docker可以直接使用
但是装docker-ce就需要依赖docker-ce的yum源了
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --show-duplicates
2.2 安装docker-ce
yum install docker-ce -y
1.开机自启动docker
systemctl enable docker
2.开启docker引擎
systemctl start docker
3.配置docker
mkdir -p /etc/docker
vim /etc/docker/daemon.json
{
"graph":"/data/docker",
"storage-driver":"overlay2",
"insecure-registries":[
"registry.access.redhat.com",
"quay.io"
],
"registry-mirrors":[
"https://q2gr04ke.mirror.aliyuncs.com"
],
"bip":"172.7.5.1/24",
"exec-opts":[
"native.cgroupdriver=systemd"
],
"live-restore":true
}
配置说明:
graph:docker的工作目录,里面存containers及images
storage-driver:存储驱动使用overlay2
insecure-registries:不安全的registries,里面的registry不需要证书就可以来回拉取镜像
registry-mirrors:阿里云的加速源
bip:docker网络建议使用172.7.5.0/24(容器的地址和主机地址有一个对应关系)
exec-opts:启动的时候额外参数,cgroupdriver使用systemd,默认docker的cgroupdriver是cgroupfs,而k8s建议使用systemd
live-restore:容器引擎死掉了。容器本身还活着。
4.重启docker引擎
systemctl restart docker
如果重启失败可以systemctl reset-failed docker.service 重置docker服务
5.查看docker info
6.启动第一个hello-world的镜像
docker run hello-world
unable to find image 'hello-world:latest' locally 我不能在本地找到一个名为hello-world:latest的镜像
1b930d010525: Pull complete 去拉镜像
Status : Downloaded newer image for hello-world:latest 已经下载完成这个hello-world:latest镜像了
docker引擎是典型的cs架构软件
第三章:docker的镜像管理
docker的核心架构
(1)镜像是容器的模板
(2)容器是镜像实例化而来的,容器也可以提交固化成镜像
(3)镜像和仓库是可以推送和拉取的
镜像的结构
${registry_name}/${repository_name}/${image_name}😒{tag_name}
远端注册的地址/仓库名字/镜像的名字/标签的名字(传统意义上都用版本号作为镜像的标签)
例如
docker.io/library/alpine:3.10.1
3.1仓库dockerhub
https://hub.docker.com
类似于github这种东西
sign up 注册账户405186254,邮箱405186254@qq.com
免费的respository必须是公开的
3.2 虚拟机上登录docker hub
docker login docker.io
登录完的信息放哪了?/root/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "NDA1MTg2MjU0OkhieXd5ODA2MTAyMCEh"
}
}
}
base64转码的
echo "NDA1MTg2MjU0OkhieXd5ODA2MTAyMCEh" | base64 -d
3.3 搜索镜像
docker search alpine
网站搜索alpine
3.4 下载镜像
docker pull alpine
下载latest的镜像
镜像结构:docker.io/library/alpine:latest
下载指定tag,现在有3.13.6
docker pull alpine:3.13.6
docker pull docker.io/library/alpine:3.10.1
3.5 查看本地镜像
docker images
3.6 给镜像打标签
给镜像id为12adea71a33b的镜像(alpine的3.13.6版本)打个标签
docker tag 12adea71a33b docker.io/405186254/alpine:v3.13.6
docker tag 12adea71a33b 405186254/alpine:latest
3.7 推送镜像
将刚才打好标签的镜像推送过去
docker push docker.io/405186254/alpine:v3.13.6
docker push docker.io/405186254/alpine:latest
docker.hub上查看镜像
3.8 删除镜像
docker rmi docker.io/405186254/alpine:latest
彻底删除镜像,强制删除
docker rmi -f 12adea71a33b
重新拉镜像
docker pull docker.io/405186254/alpine:latest
3.9 镜像的特性
基于aufs管理镜像的,分层结构
底层bootfs:整个docker镜像底层依赖的库,和内核交互的玩意
真正推送的时候是增量推送的,base image是有自己的image id的
底包很大的话,同步就增量同步了。
看层怎么设计的,增量部分
第四章:docker的基本操作
容器是镜像实例化而来的
4.1 查看本地容器
docker ps -a
4.2 启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS:选项
-i:启动一个可交互式的容器,并持续打开标准输入
-t:表示使用终端关联到容器的标准输入输出上
-d:表示将容器放置后台运行
--rm:退出后及删除容器
--name:表示定义容器的唯一名称
IMAGE:表示要运行的容器镜像
COMMAND:表示启动容器时要运行的命令
docker run -it alpine:latest /bin/sh
使用exit命令行退出,container也退出了
4.3 非交互的方式启动一个容器,一次性容器
docker run --rm alpine:latest /bin/echo hello
--rm : 代表执行完命令后就自动删除容器了
4.4 非交互式启动一个后台容器
docker run -d --name myalpine alpine:latest
发现container直接退出了,进程hang不住
没有指定特定命令的话,就自动退出了
docker run -d --name myalpine alpine:latest /bin/sleep 300
4.5 容器里起的进程,能不能在宿主机上被查看到
可以
4.6 进入容器
docker exec -it 容器id
docker exec -it 3d91ca7fc2eb /bin/sh
4.7 停掉容器
docker stop 3d91ca7fc2eb
4.8 启动容器
docker start 3d91ca7fc2eb
4.9 重启容器
docker restart 3d91ca7fc2eb
4.10 删除容器
docker rm 3d91ca7fc2eb
docker rm -f 3d91ca7fc2eb 强制删除容器
for i in `docker ps -a | grep -i exit | sed '1d|awk '{print $1}'`
do
docker rm -f $i
done
4.11 容器自己的文件系统树
里面写个hello到1.txt
实际是把hello 写到了容器的可写层writable
4.12 把可写层的修改提交到镜像里,
docker commit -p myalpine 405186254/alpine:with_1.txt
4.13 导出/导入镜像
docker images
导出镜像
docker save imageId > alpine:v3.10.3_with_1.txt.tar
导入镜像
docker load < alpine:v3.10.3_with_1.txt.tar
docker tag 镜像id 405186254/alpine:v3.10.3_with_1.txt
4.14 查看容器的日志
docker logs -f 容器id
容器的标准输出读出来
5.docker容器的高级操作
5.1 映射端口
docker run -p 容器外端口:容器内端口
下载ngnix镜像
5.2 挂载数据卷
docker run -v 容器外目录:容器内目录
宿主机执行
mkdir -p /root/html
cd /root/html
wget www.baidu.com -O index.html
[root@k8s-study html]# docker run -d --rm -d -p82:80 -v /root/html:/usr/share/nginx/html 4037a5562b03
c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193
docker inspect 查看容器运行的一些细节
[root@k8s-study html]# docker inspect c3b5fb9945eb
[
{
"Id": "c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193",
"Created": "2021-11-04T09:19:35.416257874Z",
"Path": "nginx",
"Args": [
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 15190,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-11-04T09:19:35.779154566Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:4037a5562b030fd80ec889bb885405587a52cfef898ffb7402649005dfda75ff",
"ResolvConfPath": "/data/docker/containers/c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193/resolv.conf",
"HostnamePath": "/data/docker/containers/c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193/hostname",
"HostsPath": "/data/docker/containers/c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193/hosts",
"LogPath": "/data/docker/containers/c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193/c3b5fb9945eb261d75cbc0b2e597b90693c600a6570bd07a63d2fa09aefb9193-json.log",
"Name": "/laughing_wu",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": [
"/root/html:/usr/share/nginx/html"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "82"
}
]
},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": true,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/data/docker/overlay2/438030ebafb7fc677a08a79f0b734a28bbe46607e3cdea209de9508b23141d28-init/diff:/data/docker/overlay2/3b3f94566ab0f56f3b4561c8587246c65284575ea69b776e013ddf7ebd88a6e0/diff:/data/docker/overlay2/9bd287523583ed2ea8fd455448b609176365d4e5362d38c03103c426ac7f3d15/diff:/data/docker/overlay2/038bbdb5529bedeef851f402848e03fafd64a7db1c6944e562ee4c4bb01f4b2e/diff",
"MergedDir": "/data/docker/overlay2/438030ebafb7fc677a08a79f0b734a28bbe46607e3cdea209de9508b23141d28/merged",
"UpperDir": "/data/docker/overlay2/438030ebafb7fc677a08a79f0b734a28bbe46607e3cdea209de9508b23141d28/diff",
"WorkDir": "/data/docker/overlay2/438030ebafb7fc677a08a79f0b734a28bbe46607e3cdea209de9508b23141d28/work"
},
"Name": "overlay2"
},
"Mounts": [
{
"Type": "bind",
"Source": "/root/html",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
"Config": {
"Hostname": "c3b5fb9945eb",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.12.2-1~stretch",
"NJS_VERSION=1.12.2.0.1.14-1~stretch"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "4037a5562b03",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "cbe2ed9c93572f7a0616c3798ccd4db1186344d2ef52e297f228ebcfa31624ae",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "82"
},
{
"HostIp": "::",
"HostPort": "82"
}
]
},
"SandboxKey": "/var/run/docker/netns/cbe2ed9c9357",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "1c790bde74bf4a4187077614b15c8489462f1baa883b0e9ecf0df166ec39d9ec",
"Gateway": "172.7.5.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.7.5.3",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:07:05:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "8f91bdf43e668dc020614078ae92e9aa16f855083bbe4ad0069cb2aff405be31",
"EndpointID": "1c790bde74bf4a4187077614b15c8489462f1baa883b0e9ecf0df166ec39d9ec",
"Gateway": "172.7.5.1",
"IPAddress": "172.7.5.3",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:07:05:03",
"DriverOpts": null
}
}
}
}
]
5.3 传递环境变量
openstack就没有这个功能
可以按照自己想要的方式启动容器
docker run --rm -e E_OPTS=abcdefg HOME=/root
启动前接受一些参数,
云原生主要就是依赖这个,不同项目可能用一个底包,通过不同的环境变量,指定启动不同的jar包
docker run --rm -e E_OPTS=abcdefg 405186254/alpine:latest printenv
5.4 容器内安装软件
yum/apt
5.5 容器的生命周期
- 检查本地是否存在镜像,如果不存在从远端仓库检索
- 利用镜像启动容器
- 分配一个文件系统,只读的镜像层外挂一层可读写层
- 从宿主机的网桥接口中桥接一个虚拟接口到容器中
- 从地址池配置一个ip地址给容器
- 执行用户指定的指令
- 执行完毕后容器终止
宿主机上是有一个叫做docker0的网卡设备的
用户命令,做为一个前台进程hang在控制台的这种,不退出。容器的生命周期的解释
6.DockerFile
6.1 docker镜像的制作途径
docker可以自动构建镜像,通过从dockerfile文件中读取指令
dockerfile是一个txt的文本文件,包含了命令,组装这个镜像。
6.2 docker file规则
# 为注释
指令(大写) 内容(小写)
尽管指令大小写不铭感,我们建议指令大写,内容小写表示
docker是按照顺序执行dockerfile里的指令集合的
每一个dockerfile第一个非注释行指令必须是FROM指令,用于为镜像文件的构成过程中,指定基准镜像镜像,后续的指令运行于此基准镜像所提供的运行环境中
基准镜像可以是任何可用的镜像文件,默认情况下docker build,会在docker主机本地上查找指定的镜像文件,在本地不存在时,会从docker register上拉取所需镜像文件
6.3 docker 指令USER/WORKDIR
USER : 用途是指明docker里面主进程init进程,pid为1的进程是用什么用户启动
WORKDIR : 工作目录,相当于cd /usr/share/nginx/html,后面的命令都是在这个目录下执行的
范例
vim /data/dockerfile/Dockerfile
FROM docker.ip/405186254/nginx:v1.12.2
USER nginx
WORKDIR /usr/share/nginx/html
构建镜像
cd /data/dockerfile
docker build . -t docker.io/405186254/nginx:v1.12.2_with_user_workdir
启动镜像
docker run --rm -ti 405186254/nginx:v1.12.2_with_user_workdir /bin/bash
whoami
pwd
6.4 docker 指令ADD/EXPOSE
add:会了add指令就好,copy指令可以不会,往容器里面放文件和放东西,可以放目录
expose:容器里哪个端口要被暴露出来
FROM docker.io/405186254/nginx:v1.12.2
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
将下载的百度首页和Dockerfile放同一级目录里,构建镜像
docker build . -t 405186254/nginx:v1.12.2_with_index_expose
expose怎么使
# docker run --rm --it -P 405186254/nginx:v1.12.2_with_index_expose /bin/bash
docker run --rm -d -P 405186254/nginx:v1.12.2_with_index_expose
宿主机上会起一个端口32768,随机生成一个端口,(-P 就是随机起了一个端口把里面的80端口给代理出来了)
实际生产中expose指令很鸡肋的,只是为了讲-P 参数随机生成一个端口,-p是用来在宿主机上生成指定端口。
dockerfile里面的expose指令是和外面的-P指令配合使用的,如果外面使用-p指令的话,里面的expose指令并不生效
6.5 docker 指令RUN/ENV
RUN指令是构建镜像时操作的一些东西
yum list bind --show-duplicates
ENV环境变量
FROM centos:7
ENV VER 9.11.4
RUN yum install bind-$VER -y
RUN指令,在构建镜像的时候帮你执行一些指令
docker build . -t 405186254/bind:v9.9.4_with_env_run
docker run --it --rm 405186254/bind:v9.9.4_with_env_run /bin/bash
6.6 docker指令CMD
CMD指令是容器启动时,执行的一些指令,显示的运行在前台
FROM centos:7
RUN yum install httpd -y
CMD ["httpd","-D","FOREGROUND"]
docker build . -t 405186254/httpd:test
docker run -d --rm -p83:80 405186254/httpd:test
docker ps -a
6.7 docker指令ENTRYPOINT指令
容器启动之前做一些初始化配置,或者一些自定义的配置等。通常是一个脚本,然后在脚本里配置相关预定义项.
常用来处理容器初始化的一些动作
每一个docker镜像都有一个默认的cmd命令。会开机默认执行/entrypoint.sh脚本。如果什么都没有就走/bin/bash
自定义cmd > 默认/entrypoint.sh > 默认/bin/sh
自定义entrypoint.sh
#!/bin/bash
# utf-8
/sbin/nginx -g "daemon off;"
FROM centos:7
ADD entrypoint.sh /entrypoint.sh
RUN yum install epel-release -q -y && yum install nginx -y
ENTRYPOINT /entrypoint.sh
用于多个cmd命令,复杂不如写脚本调用
走的还是entrypoint.sh
如果docker run执行的时候,最后接的cmd命令是可以替换掉镜像里最后代的cmd命令的,但是如果用的是entrypoint.sh,没有cmd,是替换不掉的
7.第七章:综合实验
运行一个docker容器,在浏览器打开demo.od.com能访问到百度首页
准备docker镜像
Dockerfile
FROM 405186254/nginx:v1.12.2
USER root
ENV WWW /usr/share/nginx/html
ENV CONF /etc/nginx/conf.d
RUN /bin/cp /usr/share/zoneInfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
WORKDIR $WWW
ADD index.html $WWW/index.html
ADD demo.od.com.conf $CONF/demo.od.com.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
demo.od.com.conf
server {
listen 80;
server_name demo.od.com;
root /usr/share/nginx/html;
}
综合实验,准备一个jar包,直接docker运行这个jar包,访问8000端口内的地址
Dockerfile
FROM centos:6.10
USER root
RUN useradd admin && /bin/rm -f /etc/yum.repos.d/*
WORKDIR /home/admin
ADD Centos-6.repo /etc/yum.repos.d/Centos-6.repo
ADD jdk1.8.0_131 /export/servers/jdk1.8.0_131
ADD k8s-1.0-SNAPSHOT.jar /export/App/k8s-1.0-SNAPSHOT.jar
RUN /bin/cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone && chown admin.admin -R /export && yum install iputils iotop telnet nc iproute net-tools -y
CMD ["/export/servers/jdk1.8.0_131/bin/java","-jar","/export/App/k8s-1.0-SNAPSHOT.jar"]
Centos-6.repo
[base]
name=CentOS-6
failovermethod=priority
baseurl=http://mirrors.sohu.com/centos/6.10/os/x86_64/
gpgcheck=0
7.构建一个镜像,起java进程
Dockerfile
FROM centos:6.10
USER root
RUN useradd admin && /bin/rm -f /etc/yum.repos.d/*
WORKDIR /home/admin
ADD Centos-6.repo /etc/yum.repos.d/Centos-6.repo
ADD jdk1.8.0_131 /export/servers/jdk1.8.0_131
ADD k8s-1.0-SNAPSHOT.jar /export/App/k8s-1.0-SNAPSHOT.jar
RUN /bin/cp -rf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone && chown admin.admin -R /export && yum install iputils iotop telnet nc iproute net-tools -y
ADD entrypoint.sh /entrypoint.sh
ENTRYPOINT ["sh","/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
# utf-8
/export/servers/jdk1.8.0_131/bin/java -jar /export/App/k8s-1.0-SNAPSHOT.jar
exec "$@"
8.第八章:docker的网络模型
备注:不建议mysql放docker里,k8s,docker最适合的是那种无状态的服务
1.默认NAT
宿主机上docker0的网络设备去虚拟出来了docker的网络
nat哪配置的呢?是从daemon.json里配置的
2.None
不需要docker里有网络设备,不提供网络服务,只用到计算资源和存储资源
3.Host
会用到
docker和宿主机在同一个网络
docker run -it --rm --net=host xxxxx /bin/bash
4.联合网络(k8s用的比较广泛)
两个容器共享一个网络namespace
docker run -it --rm --net container:containerId 405186254/nginx:curl /bin/bash
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示