第三章 Kubernetes之Docker必知必會

3-1 為什么需要Docker?k8s與Docker的關(guān)系?

3.1.1 Docker VS 虛擬機

image

官方解釋:Package Software into Standardized Units for Development, Shipment and Deployment.

3.1.2 為什么需要Docker

image

3.1.3 Docker的系統(tǒng)組成

image

3.2 Docker namespace 隔離

3.2.1 Docker通過 Namespace 實現(xiàn)進程隔離

通過clone()在創(chuàng)建新進程的同時創(chuàng)建namespace。

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

3.2.2 Namespace 隔離類型

  • UTS namespace

UTS(UNIX Time-sharing System)namespace提供了主機名與域名的隔離,這樣每個docke容器就可以擁有獨立的主機名和域名了,在網(wǎng)絡.上可以被視為- -個獨立的節(jié)點,而非宿主機.上的一個進程。

  • IPC namespace

進程間通信(nter-Pracess Communication,IPC)涉 及的IPC資源包括常見的信號量、消息隊列和共享內(nèi)存。在同一個IPC namespace下的進程彼此可見,不同IPC namespace下的進程則互相不可見。

  • PID namespace

PID namespace隔離非常實用,它對進程PID重新標號,即兩個不同namespace下的進程可以有相同的PID。每個PID namespace都有自己的計數(shù)程序。內(nèi)核為所有的PID namespace維護了一個樹狀結(jié)構(gòu),最頂層的是系統(tǒng)初始時創(chuàng)建的,被稱為root namespace,它創(chuàng)建的心PID namespace被稱為

child namespace(樹的子節(jié)點)。

通過這種方式,不同的PIDnamespace會形成一個層級體系。所屬的父節(jié)點可以看到子節(jié)點中的進程,并可以通過信號等方式對子節(jié)點中的進程產(chǎn)生影響。反過來,子節(jié)點卻不能看到父節(jié)點PID。

3.2.3 實踐:通過unshare()在原先進程上進行namespace隔離

最后要說明的系統(tǒng)調(diào)用是unshare(),它與clone()很像,不同的是,unshare()運行 在原先的進程上,不需要啟動一個新進程。

$ sudo unshare --fork --pid --mount-proc bash
ps aux
image

3.2.4 Docker 的實現(xiàn)原理:Docker 如何通過 Namespace 聚合進程,實現(xiàn)進程間隔離。

docker run -d -p 8083:8083  nginx
ps -ef|grep docker 
ls -al /proc/[PID]/ns

3.3 Docker 的資源配額 CGroups

  1. Docker 使用CGroups實現(xiàn)資源的配額管理。
  • Cgroups (control groups)

  • 2007年由谷歌工程師研發(fā)

  • 2008年并入 Linux Kernel 2.6.24

  • C語言實現(xiàn)

  1. CGroups 限制進程的 CPU使用時間。 Docker中的 CPU,內(nèi)存,網(wǎng)絡的限制均通過 cgroups 實現(xiàn)
    image
  2. 實踐 在宿主機上創(chuàng)建一個讓 CPU 飆升到100%的進程: (此操作有風險,慎用)

while : ; do : ; done &

記錄下 PID = 27358

cd /sys/fs/cgroup/cpu
mkdir cgroups_test
echo 20000 > /sys/fs/cgroup/cpu/cgroups_test/cpu.cfs_quota_us
echo 27358 > /sys/fs/cgroup/cpu/cgroups_test/tasks

20000代表2萬微秒,也就是20%的CPU配額

清理該進程

kill -9 27358

  1. docker 里如何加參數(shù)進行資源配額 docker run -it --cpus=".5" nginx /bin/sh,其中的.5表示0.5即50% 進入容器查看是否有對應的 cgroup 設置
cd /sys/fs/cgroup/cpu
cat cpu.cfs_quota_us

配置顯示 500000即50%的CPU配額,證明--cpus=".5"的參數(shù)已經(jīng)生效

image

3-4 Docker鏡像

3.4.1 Docker鏡像的由來

  • 雖然 Docker 實現(xiàn)了運行環(huán)境的隔離,但如何將一個運行的容器快速進行啟動,復制,遷移到其他的主機上運行?
  • 如果容器無法快速進行復制,遷移,那么和以 VMware 為代表的虛擬化技術(shù)相比并沒有太多優(yōu)勢

3.4.2 Docker 鏡像的特性

  • Docker 鏡像具備了應用運行所需要的所有依賴

  • 一次構(gòu)建,處處運行

  • Docker 鏡像的存儲是基于 checksum 的去重存儲,大大降低存儲空間

3.4.3 Docker 鏡像常用命令

  • 下載 Docker 鏡像 docker pull nginx

  • 為鏡像打版本號 docker tag

  • 上傳 Docker 鏡像 docker push


3-5 編寫博客 應用的 Dockerfile

FROM openjdk:8-jdk-alpine
MAINTAINER QingFeng
VOLUME /tmp
ADD target/kubeblog.jar /kubeblog.jar
EXPOSE 5000
ENTRYPOINT ["java","-jar","/kubeblog.jar"]

3-6 為博客應用構(gòu)建 Docker 鏡像

  • 增加 mysql57 hosts 記錄,作為數(shù)據(jù)庫的域名
vi /etc/hosts
127.0.0.1    mysql57
  • 下載代碼,構(gòu)建 mvn package
git clone <git url>
cd /root/kubeblog/Final
mvn package
  • 構(gòu)建 Docker 鏡像
docker build -t kubeblog .
  • 查看 docker 鏡像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kubeblog            1.0                 f9bb30633155        4 minutes ago       148MB
  • 將鏡像推到自己的dockerhub
[root@swarm-manager Final]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: insaneloafer
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[root@swarm-manager Final]#
[root@swarm-manager Final]# docker tag kubeblog:1.0 insaneloafer/kubeblog:1.0
[root@swarm-manager Final]#
[root@swarm-manager Final]# docker push insaneloafer/kubeblog:1.0
The push refers to repository [docker.io/insaneloafer/kubeblog]
b0e8272da662: Pushed
138726990cf7: Mounted from library/openjdk
5b40c5fb5220: Mounted from library/openjdk
717b092b8c86: Mounted from library/openjdk
1.0: digest: sha256:3023f7b6ae04313c72504dd608f6b8bc1e5268aaa97d5529ba7d7cd360dae243 size: 1159
image

3-7 Docker run --link運行博客應用

  • docker run --link運行博客應用

--link表示運行容器時與哪個容器進行網(wǎng)絡連接。

docker run --name kubeblog -d -p 5000:5000  --link mysql57 kubeblog:1.0

-進入容器查看環(huán)境變量 evn

docker exec -it kubeblog sh
env |grep MYSQL
MYSQL57_ENV_MYSQL_MAJOR=5.7
MYSQL57_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL57_ENV_MYSQL_ROOT_PASSWORD=password
MYSQL57_ENV_GOSU_VERSION=1.12
MYSQL57_PORT_3306_TCP_PORT=3306
MYSQL57_PORT_3306_TCP_PROTO=tcp
MYSQL57_PORT_33060_TCP_ADDR=172.17.0.2
MYSQL57_PORT=tcp://172.17.0.2:3306
MYSQL57_PORT_3306_TCP=tcp://172.17.0.2:3306
MYSQL57_PORT_33060_TCP_PORT=33060
MYSQL57_ENV_MYSQL_VERSION=5.7.30-1debian10
MYSQL57_PORT_33060_TCP_PROTO=tcp
MYSQL57_NAME=/kubeblog/mysql57
MYSQL57_PORT_33060_TCP=tcp://172.17.0.2:33060
  • 更新/etc/hosts文件
cat /etc/hosts

127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  mysql57 401b104b930a
172.17.0.3  2028007380c4
  • 在宿主機訪問 centos 虛擬機上的 kubeblog 應用,需要關(guān)閉虛擬機防火墻
systemctl stop firewalld
192.168.99.101:5000
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容