下載安裝
根據官網上的指引,可以在Ubuntu上下載docker。其中有
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
這一段,是把docker的倉庫加入apt源中。但是貌似不加也可以直接下載,甚至速度更快。
然後sudo apt-get update
,sudo 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鏡像。