CKAD备战笔记(2)- 配置
1. Dockerfile
CMD
假设我们用Dockerfile
创建了自己的镜像myImg
。
CMD
是容器跑起来之后默认会跑的命令,如果docker run
中重新定义了命令,那么CMD
中的内容会被完全重写,比如:
docker run myImg sleep 10
# 用于创建镜像`myImg`的Dockerfile:
FROM ubuntu
CMD ["sleep", "5"]
结果: sleep 10
会覆盖CMD sleep 5
。最终,容器会睡10秒钟。
ENTRYPOINT
# 用于创建镜像`myImg`的Dockerfile:
FROM ubuntu
ENTRYPOINT ["sleep"]
ENTRYPOINT
会把docker run
中的命令,添加到ENTRYPOINT
命令的后面。比如:
docker run myImg 10
结果:sleep
这个命令来自ENTRYPOINT
,而秒数来自docker run
中给的参数。最终执行的命令是:
sleep 10
容器会睡10秒钟。
⚠️ 如果
docker run
中没有给参数,那就会报错⚠️ Dockerfile中定义的命令,可以是
shell
格式,或者json
格式:
- SHELL格式:
CMD sleep 5
- JSON格式:
CMD ["sleep", "5"]
:注意第一个元素要是可执行的命令,接下来才是参数以上两者效果是一样的
ENTRYPOINT + CMD
ENTRYPOINT
的使用感觉更合理,但是当没有给参数时,会报错,要是有个默认值就好了。这时候我们可以同时使用ENTRYPOINT
和CMD
:
# 用于创建镜像`myImg`的Dockerfile:
FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]
⚠️ 注意:这里一定要用json
格式
docker run myImg # 使用默认值参数 5
docker run myImg 10 # 或者自定义参数为 10
docker run --entrypoint sleep2.0 myImg 10 # 或者自定义命令和参数:假设我们想用新版本的命令`sleep2.0`
使用Dockerfile
用最后那个同时用了ENTRYPOINT
和CMD
的Dockerfile
建的镜像来创建Pod:
cd myFolder
ls # 这里应该能看到你写的Dockerfile
docker build -t myImg . # 用当前路径下的Dockerfile建镜像,名字叫`myImg`
接下来新建一个YAML文件,在文件中使用新建的镜像myImg
:
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myPod
spec:
containers:
- name: myContainer
image: myImg
command: ["sleep2.0"] # 执行命令
args: ["10"] # 可变参数
要设置的命令/参数 | Dockerfile | yaml | docker run ... |
kubectl run |
---|---|---|---|---|
sleep2.0 | ENTRYPOINT |
.spec.containers.command |
跟在--entrypoint 后 |
k run myPod --image=myImg --command sleep2.0 |
10 或者 --position=bed |
CMD |
.spec.containers.args |
直接加在命令后 | k run myPod --image=myImg -- 10 或者 k run myPod --image=myImg -- --position bed |
⚠️注意,附加到 docker run
的任何内容都应该以json
数组的格式写到YAML文件里。
⚠️ 用kubectl create -f pod.yaml
跑一下这个YAML文件
2. Pod和Deployment
Pod
Pod在建成之后,除了以下这些属性,其他的内容是无法修改的:
spec.containers[*].image
spec.initContainers[*].image
spec.activeDeadlineSeconds
spec.tolerations
如果想要修改已存在的Pod的话,可以这样:
kubectl get pod xxx -o yaml > new-pod.yml
vi new-pod.yml # 然后按照你的要求修改new-pod.yaml
kubectl delete pod xxx
kubectl create -f new-pod.yml
⚠️ 注意:该设计是合理的,因为Pod
是Deployment
生成的产物。如果想要修改Pod
的某个参数,那么 更合理的方法 是修改Deployment
,然后让Deployment
生成新的Pod
,而不是直接删除Pod
!
Deployment
和Pod
不同,Deployment
可以简单的通过kubectl edit deployment my-deployment
修改。
3. 环境变量(env)
举例:
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp-color
spec:
containers:
- name: simple-webapp-color
image: simple-webapp-color
port:
- containerPort: 8080
env:
- name: APP_COLOR
value: pink
环境变量(env
)可以由以下三种方法进行配置:
- 纯键值对
- 从
ConfigMap
取值 - 从
Secret