摘要:以下為幾個常用的指令依賴鏡像所有都必須以命令開始,表示其依賴的鏡像。的端口不使用公有端口。與命令使用數組語法。推薦阿里云,畢竟有錢,穩定。參數表示后臺守護進程運行容器。執行,運行應用。
一些概念 Docker Registrydocker 即容器
Docker 遠程鏡像倉庫
DockerHub
DaoCloud / Aliyun
Docker ImagesDocker Images 是用來創建 docker 容器的只讀模版,其中包含了容器啟動所需要的所有配置信息和運行程序,一次構建之后可以多次復用。
從結構上來講,Docker Image 是分層次的,如圖所示:
這樣就自然出現了父鏡像和基礎鏡像的概念,在圖中,每一個上層鏡像都是依賴于下一層的鏡像,所以下層鏡像可稱為上層鏡像的父鏡像,而最底層的鏡像是沒有父鏡像的,可稱其為基礎鏡像(Base Image)。
實際場景下,一般我們自己創建的鏡像都會依賴于某個 Linux 操作系統的鏡像,例如 ubuntu,大多數情況下,我們可稱其為基礎鏡像,但是我們也可以查看 ubuntu 鏡像的 Dockerfile 會發現,它也是依賴于一個叫 scratch 的鏡像,scratch 是 docker 的一個空鏡像,里面只有 docker 加入的一些元數據,如果我們想要追求自己的鏡像盡可能的輕量,也可以將 scratch 鏡像作為我們的基礎鏡像來構建。
DockerfileDockerfile 是用來說明如何自動構建 docker image 的指令集文件,在 Dockerfile 中編寫好指令集之后,我們就可以通過 docker build 命令構建鏡像,Dockerfile 文件中命令的順序就是構建過程中執行的順序。
以下為幾個常用的指令:
所有 Dockerfile 都必須以 FROM 命令開始,表示其依賴的鏡像。
FROM image_name
MAINTAINER author
RUN
ADD /path/to/sourcefile/in/host /path/to/targetfile/in/container
CMD ["executable","param1","param2"]
EXPOSE
WORKDIR /path/to/workdir/in/container
VOLUME ["/data"]
關于 Dockerfile 編寫有以下幾點需要注意:
盡量不要省略 MAINTAINER 信息。
EXPOSE 的端口不使用公有端口。
CMD 與 ENTRYPOINT 命令使用數組語法。
另外,在國內使用 docker(以 ubuntu 為例), Dockerfile 第一個執行的命令最好為(具體原因你猜):
RUN sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && apt-get update --fix-missing && apt-get -y upgradeDocker Container
Docker Container 中包含了我們的應用代碼和代碼執行的環境,是用來打包分發代碼的單元。
構建鏡像首先要編寫 Dockerfile,在文件中寫入構建鏡像需要的指令集,然后執行下面命令:
docker build {image_name} {/path/to/Dockerfile}
例如,我們構建一個 mysql 的鏡像,先編寫 Dockerfile
FROM ubuntu:14.04 MAINTAINER Tairy# Install Base. RUN sed -i "s/archive.ubuntu.com/mirrors.aliyun.com/g" /etc/apt/sources.list && apt-get update && apt-get -y upgrade && apt-get install -y build-essential && apt-get install -y software-properties-common && apt-get install -y byobu curl git htop man unzip vim wget RUN apt-get -y install mysql-server EXPOSE 3306 CMD ["mysqld"]
執行
docker build -t mysql ./
構建工具將先在本地查找 ubuntu:14.04 的鏡像,如果有,則直接依賴使用,如果沒有,將去遠程的倉庫中下載官方構建的 ubuntu:14.04 的鏡像,當然因為一些不可描述的原因,這個下載過程成功率不大,而且非常耗時,所以我們可以做如下優化:
docker pull daocloud.io/library/ubuntu:wily-20160706
然后將 Dockerfile 中 FROM 命令修改為:
# 我注冊了daocloud 賬號,就使用 daocloud 的鏡像,也可以選擇使用阿里云的鏡像。 FROM daocloud.io/library/ubuntu:wily-20160706
這樣,就節省了很多的時間。
總之,在安裝環境的過程中,因為某個偉大的防火墻工程,我們需要的大部分資源都沒法順利的獲取到,解決辦法就是將下載的源換成國內某些廠商提供的鏡像源。(推薦阿里云,畢竟有錢,穩定。)
經過一段時間的自動構建,便可生成一個可用的 mysql 鏡像,使用 docker images 命令查看構建好的鏡像列表,輸出:
REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest ffe5a4341fee 1 days ago 1.009 GB
刪除一個鏡像,使用下面命令:
# -f 表示強制刪除,慎重使用 docker rmi -f image_name創建容器
有了基礎的鏡像模板之后,就可以創建容器來執行應用代碼,具體用到 run 命令:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如我們要創建一個運行 mysql 的容器,可以執行
docker run -d --name db1 -v `pwd`:/data:rw -p 8001:3306 mysql
這條命令將創建后臺執行的 mysql 容器,里面運行一個 mysql 服務器,可以使用 docker ps 命令查看啟動的容器。
-d 參數表示后臺守護進程運行容器。
--name 參數表示容器的名稱,可隨意取。
-v 表示主機和容器共享文件的映射,容器的目錄就是 Dockerfile 中用 VOLUME 命令定義的目錄。
-p 表器主機和容器端口映射,容器的端口就是 Dockerfile 中用 EXPOSE 命令綁定的端口。
關于創建容器的時候的坑:
一般來說,我們會在 Dockerfile 中的最后用 CMD 命令定義容器啟動之后執行的命令,但是如果我們定義的命令執行報錯或者命令沒有創建一個守護進程的話,docker ps 之后是看不到容器在運行的,此時可以使用 docker l ogs 命令查看容器啟動的日志,進行排錯。
當然,我們也可以在 run 的時候定義容器啟動的命令,例如下面命令將啟動一個 ubuntu 的容器,并執行 /bin/bash 程序,進入 ubuntu 的 terminal:
docker run -it ubuntu:14.04 /bin/bash
此命令成功的標志就是你會發現命令行變成了類似:
root@d71ff8587917:/#
說明現在已經進入了 ubuntu 的容器中,可以直接在此命令行中操作 ubuntu,或者輸入 exit 回車之后即可退出,退出之后再 docker ps 會發現容器也不再運行了。
一些常用命令:
docker ps -a 命令可以列出所有的容器,包括已經終止運行的。
docker rm container_name/container_id 可以刪除某個容器。
docker start container_name/container_id 啟動某個容器。
docker stop container_name/container_id 終止某個容器。
docker exec -it contaner_name /bin/bash 在容器中執行 /bin/bash,執行該命令之后將可以以交互命令行的方式操作容器,另外 /bin/bash 可以替換成任意可執行命令。
Docker composedocker-compose 是用來創建和管理多容器應用的工具,使用 docker-compose 只需三步:
編寫應用運行環境的 Dockerfile,即 image。
編寫 docker-compose.yml,在 services 塊下指定容器相關參數以及與其它容器的依賴關系。
執行 docker-compose up,運行應用。
一個簡單的 docker-compose.yml 如下:
version: "2" # compose 版本,當前為 2 services: web: # web 容器 build: . # Dockerfile 所在路徑 ports: - "5000:5000" # 端口映射 volumes: - .:/code # 文件路徑映射 - logvolume01:/var/log links: - redis # 鏈接容器 redis: image: redis # 定義鏈接容器 volumes: logvolume01: {}
Compose file reference
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26693.html
摘要:此刻的后手指依舊飛速地敲打鍵盤,絲毫沒有要停不下來意思。閱讀本期技術周刊,你不光能弄明白什么是,使用的意義何在,還將被傳授秘籍,以達的境界。周刊篩選的每篇內容,是作者的獨到見解,踩坑總結和經驗分享。 showImg(https://segmentfault.com/img/bVC5qJ?w=900&h=385); 啪嗒啪嗒,啪嗒啪嗒,聽到后排動感十足的清脆鍵盤響,我就能猜到公司程序員定...
摘要:使用有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。目錄實踐一了解架構實踐二使用教程實踐三下構建開發環境實踐四環境容器化實踐五生產環境容器化實踐六容器監控實踐七提升幸福感實踐八構建開發環境實踐九生產環境優化參考源碼分析系列文章 使用 docker 有一段時間了,打算把自己實踐過程中的一些理解和感悟記錄下來。 系列文章發布在 SegmentFault 上我的專欄 Tairy,...
摘要:上一篇簡介常用命令與實踐一六鏡像操作獲取鏡像下載鏡像到本地上有大量的高質量的鏡像可以用,這里我們就說一下怎么獲取這些鏡像。 【上一篇:Docker簡介、常用命令與實踐(一)】 六、Docker鏡像操作 6.1 獲取鏡像(下載鏡像到本地) Docker Hub?上有大量的高質量的鏡像可以用,這里我們就說一下怎么獲取這些鏡像。從 Docker 鏡像倉庫獲取鏡像的命令是?docker pul...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自第二篇。總結本章知識介紹了最基本的十五個命令,接下來的教程將會陸續介紹如何在中運行一個應用以及其他的命令。接下來會在本系列教程結束后補充幾篇應用的實例。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第二篇 Part 2: The 15 Commands。 該系列所有文章將參考其他學習...
摘要:本系列教程翻譯自,系列共有九篇,本文譯自第二篇。總結本章知識介紹了最基本的十五個命令,接下來的教程將會陸續介紹如何在中運行一個應用以及其他的命令。接下來會在本系列教程結束后補充幾篇應用的實例。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第二篇 Part 2: The 15 Commands。 該系列所有文章將參考其他學習...
閱讀 3482·2021-10-13 09:39
閱讀 1466·2021-10-08 10:05
閱讀 2270·2021-09-26 09:56
閱讀 2286·2021-09-03 10:28
閱讀 2686·2019-08-29 18:37
閱讀 2043·2019-08-29 17:07
閱讀 607·2019-08-29 16:23
閱讀 2198·2019-08-29 11:24