docker從入門到實戰-基礎篇

docker從入門到實戰-基礎篇

docker基礎

前言

本文是我經過三個星期業餘時間學習後而寫的文章,對docker的瞭解還處於入門階段。但願本文能幫忙一些想學習docker的朋友快速入門。練習及實戰代碼都在github倉庫中。若是個人文章能幫助到你的話,能夠給個人docker項目點個贊哦javascript

介紹

docker是一個開源的應用容器引擎,開發者能夠打包本身的應用到容器裏面,而後遷移到其餘機器的docker應用中,能夠實現快速部署。若是出現的故障,能夠經過鏡像,快速恢復服務。html

舉個例子,公司通常都會有多套環境,那麼如何保持多套的運行環境一致,這個時候就能夠用到docker。且當要求增長一套環境的時候,你無需在一個新服務器上一個個環境安裝、配置。只須要運行下docker。同時官方還提供了Docker Hub,擁有大量的高質量的官方鏡像。你能夠將本身的鏡像上傳上去。有點相似於githubjava

安裝

官方提供了安裝教程,挺詳細的。官方安裝教程node

docker起步

第一步:執行下docker -v確認下是否成功安裝了dockermysql

若是成功安裝了,命令行將會輸出入docker的版本號。以下:
Docker version 18.09.2, build 6247962git

docker的整個生命週期大體可分爲:github

  1. 鏡像
  2. 容器
  3. 倉庫

這裏以ubuntu鏡像爲例,介紹下鏡像sql

在下載ubuntu鏡像以前運行下docker images(查看鏡像命令)查看下本地的鏡像。若是你還沒下載過鏡像的話,固然會出現空。這裏貼下我本地的鏡像docker

➜ study-docker git:(master) ✗ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
todolist_static latest de5e325037e9 2 hours ago 1.05GB
todolist_nodejs latest 53efd80e03e1 2 hours ago 898MB
ubuntu 18.04 7698f282e524 4 weeks ago 69.9MB
mysql latest 990386cbd5c0 5 weeks ago 443MB
node 8 a5c31320f223 6 weeks ago 895MB
mysql 5.6 73829d7b6139 6 weeks ago 256MB

使用拉取鏡像命令docker pull 拉取ubuntu鏡像:docker pull ubuntu。當你不指定版本時,默認拉取latest版本。express

➜ study-docker git:(master) ✗ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest
➜ study-docker git:(master) ✗ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 4c108a37151f 12 hours ago 64.2MB

也可安裝指定版本鏡像:docker pull ubuntu:18.04

接下來基於ubuntu鏡像啓動一個容器

docker run --name first -it ubuntu bash

  • --name 用於指定容器名
  • it 用於交互式命令行操做,以下面例子運行後,會打開容器的命令行
  • 上面的ubuntu指的鏡像,默認基於latest。除非指定版本 如ubuntu:18.04

運行上面的命令後,命令行工具就會自動進入容器的命令行。若是想要退出該命令行界面,可輸入exit以退出。

➜ study-docker git:(master) ✗ docker run --name first -it ubuntu bash
root@b7862a018c2c:/#

若是想讓該容器在後臺運行能夠經過加-d配置來讓該容器在後臺運行。後臺運行,命令行工具不會進入該容器。

使用docker ps查看當前運行中的容器。

➜ study-docker git:(master) ✗ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf8375f48225 ubuntu "bash" 15 seconds ago Up 14 seconds first

使用-d來讓容器在後臺運行

➜ study-docker git:(master) ✗ docker run --name first -itd ubuntu bash
6df29a09d1f1bb0041b7eb59b5288162471ed8a663007f88c6a30e3fd1f4fbe2

命令行會返回容器id

使用docker container ls 查看全部容器列表(不包括中止運行的容器)

➜ study-docker git:(master) ✗ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cf8375f48225 ubuntu "bash" About a minute ago Up About a minute first

使用docker stop <容器id或容器名稱>中止容器的運行。

➜ study-docker git:(master) ✗ docker stop 6df29a09d1f1
6df29a09d1f1

執行命令後,會返回你剛輸入容器的id。上面的容器id不須要填全。就想git的commit id同樣。

這個時候經過docker container ls是查不到容器信息的。須要用docker container ls -a來查看。

➜ study-docker git:(master) ✗ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6df29a09d1f1 ubuntu "bash" 5 minutes ago Exited (0) 4 minutes ago

能夠看到STATUS一欄處,該容器是處於中止狀態的。

使用docker rm <容器id 或者 容器暱稱>

➜ node git:(master) docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a217eea7188f ubuntu "/bin/bash" 11 seconds ago Exited (0) 10 seconds ago dreamy_ishizaka

執行docker rm a21 (id能夠不輸全)

➜ node git:(master) docker rm a21
a21

執行完以後,命令行會返回以前輸入的容器id

使用docker container prune,來清空停用狀態的容器。

使用docker exec命令進入運行中的容器

如想進入剛纔後臺運行的容器的交互式界面:docker exec -it <容器名稱 或者 容器id> bash

➜ study-docker git:(master) ✗ docker exec -it first bash
root@2a87b2f62a6e:/#

想查看更多關於docker的命令,點擊這裏

Dockerfile

舉個node鏡像的例子

新建一個文件夾

我這裏就新建一個名爲node的文件夾,具體文件可參照個人github項目的node目錄

// index.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
    res.end('success')
})
app.listen(6001)
// Dockerfile
FROM node:8
WORKDIR /home/node
COPY ../ ../
RUN npm install
CMD npm start

指令介紹

  • FROM 我這個node例子是基於node8鏡像
  • WORKDIR 指定工做區。
  • COPY 將本地目錄文件拷貝到docker中
  • RUN 運行一個容器,每一個RUN都會生成一個容器
  • CMD 執行命令,與RUN類似
注意 有必要添加.dockerignore文件,文件中能夠填寫你不想打包進容器的文件。相似於.gitignore
// .dockerignore
/node_modules
package-lock.json

詳細解釋,詳見dockerfile

docker build 命令用於使用 Dockerfile 建立鏡像

執行:docker build -t mynode .;

  • -t: 鏡像的名字及標籤,一般 name:tag 或者 name 格式;能夠在一次構建中爲一個鏡像設置多個標籤。tag不寫默認爲latest版本

要注意後面的. 這個表示Dockerfile文件在當前目錄。
構建鏡像成功以後:

➜ node git:(master) ✗ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynode latest 3cd10521f802 10 hours ago 898MB

接下來就基於該鏡像運行一個node容器:

docker run --name mynode -p 4001:6001 mynode

  • --name: 表示該容器的匿名
  • -p: 表示端口映射,由於主機的ip跟容器的ip是不一樣的,須要把容器的服務映射到0.0.0.0:本身設置的主機端口,host不填默認爲0.0.0.0。 <主機端口>:<容器中端口>;
➜ node git:(master) ✗ docker run --name mynode -p 4001:6001 mynode
> example2@1.0.0 start /home/node
> node index.js

瀏覽器訪問localhost:4001,頁面會展現出node響應的success字符串了。

構建完鏡像後,你以爲不須要該鏡像,想刪除怎麼辦呢?

首先執行:docker images列出鏡像列表

➜ node git:(master) ✗ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynode latest 3cd10521f802 10 hours ago 898MB

使用docker rmi <image id>來刪除鏡像:docker rmi 3cd10521f802,若是提醒該鏡像被容器佔用着,那麼你就須要先刪除該容器(參考上面介紹的命令)。

相關文章
相關標籤/搜索