Docker靈魂探討

一、docker常見命令的操做

docker pull	拉取鏡像
docker run	根據某個鏡像建立容器
-d		後臺運行
--name		指定要建立容器的名稱
-p		將容器的端口映射到宿主機的端口
docker exec -it 	進入到某個容器中
docker rmi 	刪除image
docker ps		查看運行的container	
docker rm		刪除container 
docker ps -a 查看全部的container
複製代碼

二、Image and Container

2.1 深刻探討Image

說白了,image就是由一層一層的layer組成的。

2.1.1 官方image

github.com/docker-libr…java

2.1.2 Dockerfile

不妨咱們也來製做一個本身的image鏡像,順便學習一下Dockerfile文件中常見語法mysql

MAINTAINER mouliu
LABEL name="dockerfile-demo" version="1.0" author="mouliu"
COPY cechealth-daq-worker-hospif-1.0-SNAPSHOT.jar dockerfile-image.jar
CMD ["java","-jar","dockerfile-image.jar"]
複製代碼
2.1.2.1 FROM

指定基礎鏡像,好比FROM ubuntu:14.04git

FROM ubuntu:14.04
複製代碼
2.1.2.2 RUN

在鏡像內部執行一些命令,好比安裝軟件,配置環境等,換行可使用github

RUN groupadd -r mysql && useradd -r -g mysql mysql
複製代碼
2.1.2.3 ENV

設置變量的值,ENV MYSQL_MA JOR 5.7,能夠經過docker run --e key=value修改,後面能夠直接使 用${MYSQL_MA JOR}sql

ENV MYSQL_MAJOR 5.7
複製代碼
2.1.2.4 LABEL

設置鏡像標籤docker

LABEL email="15828626971@163.com"
LABEL name="dzzgml"
複製代碼
2.1.2.5 VOLUME

指定數據的掛在目錄ubuntu

VOLUME /var/lib/mysql
複製代碼
2.1.2.6 COPY

將主機的文件複製到鏡像內,若是目錄不存在,會自動建立所須要的目錄,注意只是複製,不會提取和 解壓vim

COPY docker-entrypoint.sh /usr/local/bin/
複製代碼
2.1.2.7 ADD

將主機的文件複製到鏡像內,和COPY相似,只是ADD會對壓縮文件提取和解壓centos

ADD application.yml /etc/dzzgml/
複製代碼
2.1.2.8 WORKDIR

指定鏡像的工做目錄,以後的命令都是基於此目錄工做,若不存在則建立瀏覽器

WORKDIR /usr/local
WORKDIR tomcat
RUN touch test.txt
複製代碼

會在/usr/local/tomcat下建立test.txt文件

WORKDIR /root
ADD app.yml test/
複製代碼

會在/root/test下多出一個app.yml文件

2.1.2.9 CMD

容器啓動的時候默認會執行的命令,如有多個CMD命令,則最後一個生效

CMD ["mysqld"] 或
CMD mysqld
複製代碼
2.1.2.10 ENTRYPOINT

和CMD的使用相似

ENTRYPOINT ["docker-entrypoint.sh"]
複製代碼

和CMD的不一樣 docker run執行時,會覆蓋CMD的命令,而ENTRYPOINT不會

2.1.2.11 EXPOSE

指定鏡像要暴露的端口,啓動鏡像時,可使用-p將該端口映射給宿主機

EXPOSE 3306
複製代碼
2.1.3 Dockerfile實戰Spring Boot項目
(1)建立一個Spring Boot項目
(2)寫一個controller @RestController
    public class DockerController {
        @GetMapping("/dockerfile")
        @ResponseBody
        String dockerfile() {
            return "hello docker" ;
        }
}
(3)mvn clean package打成一個jar包
在target下找到"dockerfile-demo-0.0.1-SNAPSHOT.jar" (4)在docker環境中新建一個目錄"first-dockerfile" (5)上傳"dockerfile-demo-0.0.1-SNAPSHOT.jar"到該目錄下,而且在此目錄建立Dockerfile
(6)建立Dockerfile文件,編寫內容 FROM openjdk:8
    MAINTAINER itcrazy2016
    LABEL name="dockerfile-demo" version="1.0" author="itcrazy2016"
    COPY dockerfile-demo-0.0.1-SNAPSHOT.jar dockerfile-image.jar
    CMD ["java","-jar","dockerfile-image.jar"]
(7)基於Dockerfile構建鏡像
docker build -t test-docker-image .
(8)基於image建立container
docker run -d --name user01 -p 6666:8080 test-docker-image
(9)查看啓動日誌docker logs user01 (10)宿主機上訪問curl localhost:6666/dockerfile
hello docker
(11)還能夠再次啓動一個
docker run -d --name user02 -p 8081:8080 test-docker-image
複製代碼
2.1.4 鏡像倉庫
2.1.4.1 docker hub

hub.docker.com

(1)在docker機器上登陸 docker login
(2)輸入用戶名和密碼
(3)docker push itcrazy2018/test-docker-image
[注意鏡像名稱要和docker id一致,否則push不成功]
(4)給image重命名,並刪除掉原來的
docker tag test-docker-image itcrazy2018/test-docker-image docker rmi -f test-docker-image
(5)再次推送,刷新hub.docker.com後臺,發現成功
(6)別人下載,而且運行
docker pull itcrazy2018/test-docker-image
docker run -d --name user01 -p 6661:8080 itcrazy2018/test-docker-image
複製代碼
2.1.4.2 阿里雲docker hub

阿里雲docker倉庫 cr.console.aliyun.com/cn-hangzhou… 參考手冊 cr.console.aliyun.com/repository/…

(1)登陸到阿里雲docker倉庫
sudo docker login --username=itcrazy2016@163.com registry.cn- hangzhou.aliyuncs.com
(2)輸入密碼 (3)建立命名空間,好比itcrazy2016
(4)給image打tag
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test- docker-image:v1.0
(5)推送鏡像到docker阿里雲倉庫
sudo docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker- image:v1.0
(6)別人下載,而且運行
docker pull registry.cn-hangzhou.aliyuncs.com/itcrazy2016/test-docker-
image:v1.0
    docker run -d --name user01 -p 6661:8080 registry.cn-
hangzhou.aliyuncs.com/itcrazy2016/test-docker-image:v1.0
複製代碼
2.1.4.3 搭建本身的Docker Harbor
(1)訪問github上的harbor項目
https://github.com/goharbor/harbor
(2)下載版本,好比1.7.1 https://github.com/goharbor/harbor/releases
(3)找一臺安裝了docker-compose[這個後面的課程會講解],上傳並解壓 tar -zxvf xxx.tar.gz
(4)進入到harbor目錄 修改harbor.cfg文件,主要是ip地址的修改爲當前機器的ip地址 同時也能夠看到Harbor的密碼,默認是Harbor12345
(5)安裝harbor,須要一些時間 sh install.sh
(6)瀏覽器訪問,好比39.100.39.63,輸入用戶名和密碼便可
複製代碼

2.2 深刻探討Container

既然container是由image運行起來的,那麼是否能夠理解爲container和image有某種關係?

理解 :其實能夠理解爲container只是基於image以後的layer而已,也就是能夠經過docker run image 建立出一個container出來。

2.2.1 container到image

既然container是基於image之上的,想一想是否可以由一個container反推出image呢? 確定是能夠的,好比經過docker run運行起一個container出來,這時候對container對一些修 改,而後再生成一個新的image,這時候image的由來就不只僅只能經過Dockerfile咯。

(1)拉取一個centos image docker pull centos
(2)根據centos鏡像建立出一個container
docker run -d -it --name my-centos centos
(3)進入my-centos容器中
docker exec -it my-centos bash
(4)輸入vim命令
bash: vim: command not found
(5)咱們要作的是 對該container進行修改,也就是安裝一下vim命令,而後將其生成一個新的centos
(6)在centos的container中安裝vim yum install -y vim
(7)退出容器,將其生成一個新的centos,名稱爲"vim-centos-image" docker commit my-centos vim-centos-image
(8)查看鏡像列表,而且基於"vim-centos-image"建立新的容器
docker run -d -it --name my-vim-centos vim-centos-image
(9)進入到my-vim-centos容器中,檢查vim命令是否存在 docker exec -it my-vim-centos bash
vim
複製代碼

能夠經過docker commit命令基於一個container從新生成一個image,可是通常獲得image的 方式不建議這麼作,否則image怎麼來的就全然不知咯

2.2.2 container資源限制

若是不對container的資源作限制,它就會無限制地使用物理機的資源,這樣顯然是不合適的。 查看資源狀況 :docker stats

2.2.2.1 內存限制
--memory Memory limit
若是不設置 --memory-swap,其大小和memory同樣
docker run -d --memory 100M --name tomcat1 tomcat
複製代碼
2.2.2.2 CPU限制
--cpu-shares 權重
docker run -d --cpu-shares 10 --name tomcat2 tomcat
複製代碼
2.2.2.3 圖形化資源監控

github.com/weaveworks/…

sudo curl -L git.io/scope -o /usr/local/bin/scope
sudo chmod a+x /usr/local/bin/scope
scope launch 39.100.39.63

# 中止scope scope stop
# 同時監控兩臺機器,在兩臺機器中分別執行以下命令
scope launch ip1 ip2
複製代碼
2.2.3 container常見操做
(1)根據鏡像建立容器
docker run -d --name -p 9090:8080 my-tomcat tomcat
(2)查看運行中的container docker ps
(3)查看全部的container[包含退出的] docker ps -a
(4)刪除container
docker rm containerid docker rm -f $(docker ps -a)
(5)進入到一個container中
docker exec -it container bash
(6)根據container生成image docker
(7)查看某個container的日誌 docker logs container
(8)查看容器資源使用狀況 docker stats
(9)查看容器詳情信息
docker inspect container
(10)中止/啓動容器
docker stop/start container
複製代碼
2.3 底層技術支持

Container是一種輕量級的虛擬化技術,不用模擬硬件建立虛擬機。 Docker是基於Linux Kernel的Namespace、CGroups、UnionFileSystem等技術封裝成的一種自 定義容器格式,從而提供一套虛擬運行環境。

Namespace:用來作隔離的,好比pid[進程]、net[網絡]、mnt[掛載點]等
CGroups: Controller Groups用來作資源限制,好比內存和CPU等
Union file systems:用來作image和container分層
複製代碼
相關文章
相關標籤/搜索