無任何基礎的docker入門

下載安裝

根據官網上的指引,可以在Ubuntu上下載docker。其中有

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

這一段,是把docker的倉庫加入apt源中。但是貌似不加也可以直接下載,甚至速度更快。

然後sudo apt-get updatesudo apt-get install docker-ce docker-ce-cli containerd.io 即可進行安裝。

基本使用

根據官方教程,通過命令 docker run hello-world 可以驗證docker是否安裝成功。這時候注意到會有報錯信息Permission denied,這時候說明當前用戶沒有權限訪問Docker,需要在命令前加上sudo

如果不想每次都加上sudo,則可以通過以下方法解決。

sudo newgrp docker
sudo gpasswd -a 你的用戶名 docker
sudo service docker restart

表示把當前的用戶列入docker用戶組。

然後我們執行docker run hello-world,可以得到正常的結果,即第一行顯示:

Hello from Docker!

這樣表示我們的Docker已經安裝成功。

繼續查看官網教程的第二部分,讓我們下載一個示例項目。這個項目下載下來後,可以看到一個如下的Dockerfile文件:

# Use the official image as a parent image
FROM node:current-slim
# Set the working directory
WORKDIR /usr/src/app
# Copy the file from your host to your current location
COPY package.json .
# Run the command inside your image filesystem
RUN npm install
# Inform Docker that the container is listening on the specified port at runtime.
EXPOSE 8080
# Run the specified command within the container.
CMD [ "npm", "start" ]
# Copy the rest of your app's source code from your host to your image filesystem.
COPY . .

然後執行命令:docker build --tag bulletinboard:1.0 . 。注意最後面有個. ,表示在當前文件夾下建立Docker Image。如果忘記加的話會顯示"docker build" requires exactly 1 argument

然後根據官網指引,下一個命令 docker run --publish 8000:8080 --detach --name bb bulletinboard:1.0

然後在本地瀏覽器訪問地址:127.0.0.1:8000,便可以看到出現了一個簡陋的網頁。

其中,--publish 參數表示一個端口映射,規則爲Docker外的端口:Docker內部的端口。比如對於這個應用,代碼裏規定的端口是8080,但是我們希望訪問的時候用8000訪問,於是通過這種方法就可以讓Docker把8000端口轉發到Docker內部的8000端口。而--name 參數表示一個簡寫名。以後要啓動這個鏡像就可以直接用docker start bb,停止就用docker stop bb

Image(鏡像)與Container(容器)

Docker的Image是一個鏡像文件,而Container則是一個該鏡像文件的實例。對於同一個鏡像文件,可以通過docker run命令產生多個Container 文件。可以通過docker images 命令查看當前Docker下載的鏡像文件。而docker ps命令可以看到當前正在運行的容器。docker ps -a 則可以看到所有的容器,包括正在運行的和已經結束運行的。

比如我們執行了多次docker run hello-world,通過docker ps -a可以看到有多個Container對應的Image是hello-world。這些Image的name都是隨機生成的。

於是按理可以通過docker start 來啓動其中的某一個容器。比如其中一個容器的名字是“awesome_gauss”,輸入以下命令:docker start awesome_gauss,然後只返回了awesome gauss一行字,並沒有別的輸出,與我們之前輸入docker run hello-world 的情形不一樣。

爲什麼會這樣呢?查閱資料可知,docker start 默認是不產生命令行輸出的,也就是不是交互模式運行的。如果要以交互模式運行,可以用docker start -i命令。這樣之後可以看到與之前一樣輸出了一大串信息,開頭是Hello from Docker。

創建自己的Container

通過前面官方教程的學習,我決定自己創建一個基於ubuntu鏡像的容器。於是Dockerfile如下:

FROM ubuntu
WORKDIR /home/zf
CMD ["python", "print('hello from ubuntu')"]

然後執行命令:docker build --tag ubuntu-hello:0.0 .。於是顯示鏡像創建成功。

再輸入命令docker run --name uh -i ubuntu-hello:0.0 (注意鏡像名要在最後面)。結果顯示

OCI runtime failed … “exec \“python\””: executable file not found in $PATH" unkown

於是猜測ubuntu中沒有自帶python,把CMD中用python打印改成echo,然後先

docker rm uh 刪除運行過的容器,在docker rmi ubuntu-hello:0.0 刪除鏡像,再重新build,run,便可以正常運行了。

也可以直接通過docker run -t ubuntu 來運行ubuntu鏡像。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章