手摸手,帶你入門docker
步驟 0: linux 非 root 用戶使用 docker
$?wget?-qO-?https://get.docker.com/?|?sh
$?sudo?usermod?-aG?docker?aaron??#這里的aaron是用戶名
$?#然后重新登陸
docker help 命令 的形式查看其幫助信息,這個技能必須會,比用的時候再去網(wǎng)上找樣例要高效的多。請牢記這一點,現(xiàn)在如果看不懂沒關(guān)系,假以時日,你自然能看懂幫助信息。步驟 1:下載鏡像文件
docker search ubuntu 看看,一般情況下選擇第一個即可,或者根據(jù) star 的數(shù)量、官方標(biāo)志來選擇,記住選擇的鏡像名字,這里是 ubuntu。
docker pull ubuntu 即可下載此 ubuntu 鏡像:(py38env)????~?docker?pull?ubuntu
Using?default?tag:?latest
latest:?Pulling?from?library/ubuntu
e6ca3592b144:?Pull?complete
534a5505201d:?Pull?complete
990916bd23bb:?Pull?complete
Digest:?sha256:cbcf86d7781dbb3a6aa2bcea25403f6b0b443e20b9959165cf52d2cc9608e4b9
Status:?Downloaded?newer?image?for?ubuntu:latest
docker.io/library/ubuntu:latest
(py38env)????~?docker?help?pull
Usage:????docker?pull?[OPTIONS]?NAME[:TAG|@DIGEST]
Pull?an?image?or?a?repository?from?a?registry
Options:
??-a,?--all-tags????????????????Download?all?tagged?images?in?the?repository
??????--disable-content-trust???Skip?image?verification?(default?true)
??????--platform?string?????????Set?platform?if?server?is?multi-platform
????????????????????????????????capable
??-q,?--quiet???????????????????Suppress?verbose?output
(py38env)????~
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST],可以看到中括號包起來的是可選的,沒有包起來的都是必輸?shù)模Q后面可以加個冒號和標(biāo)簽,就可以下載該名稱下某個具體標(biāo)簽的鏡像,如果不寫 tag,那就默認(rèn)下載最新的。步驟 2:查看鏡像文件,修改鏡像存放位置
docker images :
~/Library/Containers/com.docker.docker 路徑下,docker info 命令查看 Docker 默認(rèn)的存儲路徑,通常位于:/var/lib/docker:sudo?docker?info?|?grep?"Docker?Root?Dir"
#?Docker?Root?Dir:?/var/lib/docker

rsync?-a?~/Library/Containers/com.docker.docker/?/Volumes/path/xxx
mv?com.docker.docker?com.docker.docker.old
cd?~/Library/Containers
ln?-s?/Volumes/path/xxxx?com.docker.docker
#?停止?docker
sudo?service?docker?stop
#?編輯文件?docker-overlay.conf
cd?/etc/systemd/system/docker.service.d?#?如果沒有docker.service.d?則創(chuàng)建該路徑
sudo?vim?docker-overlay.conf??#?如果沒有則創(chuàng)建該文件
#?在文件中添加如下內(nèi)容:
#??[Service]
#??ExecStart=
#??ExecStart=/usr/bin/dockerd?--graph="新的存儲路徑"?--storage-driver=overlay
#?啟動?docker
sudo?service?docker?start
步驟 3:運行容器
docker?run?ubuntu
docker images 中對應(yīng)的 REPOSITORY 名稱。docker ps -a ?查看已運行的容器信息
docker?run?-it?--hostname=ubuntu?--name=my-ubuntu?ubuntu?/bin/bash
(py38env)????~?docker?run?-it?--hostname=ubuntu?--name=my-ubuntu?ubuntu?/bin/bash
root@ubuntu:/#?whoami
root
root@ubuntu:/#?uname?-a
Linux?ubuntu?4.19.76-linuxkit?#1?SMP?Tue?May?26?11:42:35?UTC?2020?x86_64?x86_64?x86_64?GNU/Linux
root@ubuntu:/#?ls
bin??boot??dev??etc??home??lib??lib32??lib64??libx32??media??mnt??opt??proc??root??run??sbin??srv??sys??tmp??usr??var
root@ubuntu:/#?apt?update
Get:1?http://security.ubuntu.com/ubuntu?focal-security?InRelease?[107?kB]
Get:2?http://archive.ubuntu.com/ubuntu?focal?InRelease?[265?kB]
Get:3?http://security.ubuntu.com/ubuntu?focal-security/multiverse?amd64?Packages?[1078?B]
Get:4?http://archive.ubuntu.com/ubuntu?focal-updates?InRelease?[111?kB]
Get:5?http://security.ubuntu.com/ubuntu?focal-security/main?amd64?Packages?[245?kB]
Get:6?http://archive.ubuntu.com/ubuntu?focal-backports?InRelease?[98.3?kB]
......
Fetched?14.6?MB?in?32s?(452?kB/s)
Reading?package?lists...?Done
Building?dependency?tree
Reading?state?information...?Done
2?packages?can?be?upgraded.?Run?'apt?list?--upgradable'?to?see?them.
root@ubuntu:/#
exit 退出容器,如果想再次進(jìn)入該容器,先使用 docker ps -a 查看容器狀態(tài),如果容器狀態(tài)為退出,則需要先使用 docker start 啟動容器,再使用 exec 命令進(jìn)入一個正在運行的容器。root@ubuntu:/#?exit
exit
(py38env)????~?docker?ps?-a
CONTAINER?ID????????IMAGE???????????????????????????COMMAND??????????????????CREATED?????????????STATUS??????????????????????PORTS????????????????????NAMES
8a289fba83f7????????ubuntu??????????????????????????"/bin/bash"??????????????6?minutes?ago???????Exited?(0)?5?seconds?ago?????????????????????????????my-ubuntu
9ff5f71f2327????????ubuntu??????????????????????????"/bin/bash"??????????????16?minutes?ago??????Exited?(0)?16?minutes?ago????????????????????????????kind_merkle
b3aa5185fa53????????wingszzy/redisall???????????????"/bin/sh?-c?/start.sh"???29?hours?ago????????Up?29?hours?????????????????0.0.0.0:6379->6379/tcp???romantic_nobel
9da7144ffe20????????kali????????????????????????????"/bin/bash"??????????????32?hours?ago????????Up?30?hours?????????????????0.0.0.0:8888->8888/tcp???agitated_darwin
(py38env)????~?docker?exec?-it?8a289fba83f7?/bin/bash
Error?response?from?daemon:?Container?8a289fba83f7bc4e777947e3dc429d871aa3bce67c1418698f9bb04c96f00403?is?not?running
(py38env)????~?docker?start?my-ubuntu
my-ubuntu
(py38env)????~?docker?exec?-it?8a289fba83f7?/bin/bash
root@ubuntu:/#
docker?exec?-it?my-ubuntu?/bin/bash
步驟 4:復(fù)制文件,路徑映射
(py38env)????~?docker?cp?key.txt?my-ubuntu:/root
(py38env)????~?docker?exec?-it?my-ubuntu?/bin/bash
root@ubuntu:/#?ls?/root
key.txt
root@ubuntu:/#?ll?/root
total?24
drwx------?1?root?root????4096?Sep?23?11:30?./
drwxr-xr-x?1?root?root????4096?Sep?23?11:30?../
-rw-------?1?root?root??????55?Sep?23?11:25?.bash_history
-rw-r--r--?1?root?root????3106?Dec??5??2019?.bashrc
-rw-r--r--?1?root?root?????161?Dec??5??2019?.profile
-rw-r--r--?1??501?dialout??353?Sep?20?09:49?key.txt
(py38env)????~?docker?help?cp
Usage:????docker?cp?[OPTIONS]?CONTAINER:SRC_PATH?DEST_PATH|-
????docker?cp?[OPTIONS]?SRC_PATH|-?CONTAINER:DEST_PATH
Copy?files/folders?between?a?container?and?the?local?filesystem
docker run 命令時指定。docker run -it --hostname=ubuntu2 --name=my-ubuntu2 -v /Users/aaron/:/root/ ubuntu /bin/bash 
步驟 5:網(wǎng)絡(luò)配置、端口映射
--network string 參數(shù)來指定四種網(wǎng)絡(luò)模式:bridge(默認(rèn))、host、none、container。執(zhí)行 docker network ls 可以看出(其中 container 未列出):(py38env)????~?docker?network?ls
NETWORK?ID??????????NAME????????????????DRIVER??????????????SCOPE
a3b7e595cd4e????????bridge??????????????bridge??????????????local
b49f580dfd98????????host????????????????host????????????????local
63ce10ba830f????????none????????????????null????????????????local
(py38env)????~
docker run -it -p 38022:22 --name='my-ubuntu-3' ubuntu /bin/bash 之后,容器 my-ubuntu-3 的 22 端口被映射在了宿主機(jī)的 38022 端口,我們可以直接 ssh root@localhost -p 38022 來進(jìn)入容器。如果要登陸成功,這里有個前提, ubuntu 容器已經(jīng)開啟 ssh 服務(wù),允許 root ssh 遠(yuǎn)程登陸,且你知道 root 密碼。docker run -it -p 38022:22 -p 38080:80 --name='my-ubuntu-4' ubuntu /bin/bash-P來實現(xiàn)將容器內(nèi)部開放的網(wǎng)絡(luò)端口隨機(jī)映射到宿主機(jī)的一個端口上docker port container_ID 可以查看容器的端口映射情況:(py38env)????~?docker?port?805d8ef4b504
22/tcp?->?0.0.0.0:38022
(py38env)????~
--network host 表示容器與宿主機(jī)共用網(wǎng)卡、路由等。并且該容器不會分配自己的 IP 地址。如果在容器中運行一個監(jiān)聽端口 80 的應(yīng)用,則該容器的應(yīng)用在宿主機(jī)主機(jī) IP 地址上的端口 80 上可用。步驟 6:自定義鏡像:保存修改后的容器至新的鏡像
docker commit 容器id 鏡像名稱docker rm 來刪除容器,那么對該容器的修改一直有效,但通常情況下,我們對容器作出一些修改,是為了給別人用,比如將自己的程序部署在容器中打包成鏡像,目的是為了發(fā)布出去方便別人直接使用。那么就需要將對容器的修改保存為新的鏡像。(py38env)????~?docker?exec?-it?my_host?/bin/bash
root@docker-desktop:/#?ls
bin??boot??dev??etc??home??lib??lib32??lib64??libx32??media??mnt??opt??proc??root??run??sbin??srv??sys??tmp??usr??var
root@docker-desktop:/#?cd?root
root@docker-desktop:~#?ls
root@docker-desktop:~#?touch?saved.txt
root@docker-desktop:~#?ls
saved.txt
root@docker-desktop:~#?exit
exit
(py38env)????~?docker?commit?my_host?my_ubuntu_image
sha256:3ae070a40b8da2411a0b212e8e78a7f02a19820fd45f67288b436c427316e34e
(py38env)????~?docker?images
REPOSITORY???????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
my_ubuntu_image??????????latest??????????????3ae070a40b8d????????4?seconds?ago???????171MB
kali?????????????????????latest??????????????c9c07bf9ce32????????2?days?ago??????????1.74GB
ubuntu???????????????????latest??????????????bb0eaf4eee00????????7?days?ago??????????72.9MB
(py38env)????~?docker?run?-it?my_ubuntu_image?/bin/bash
root@114112c6194d:/#?ll?/root/
total?24
drwx------?1?root?root?4096?Sep?24?07:20?./
drwxr-xr-x?1?root?root?4096?Sep?24?07:20?../
-rw-------?1?root?root???38?Sep?24?07:20?.bash_history
-rw-r--r--?1?root?root?3106?Dec??5??2019?.bashrc
-rw-r--r--?1?root?root??161?Dec??5??2019?.profile
-rw-r--r--?1?root?root????0?Sep?24?07:19?saved.txt
root@114112c6194d:/#
步驟 7:發(fā)布鏡像

docker tag my-kali somenzz/my-kali 給已存在的鏡像打個標(biāo)簽,然后執(zhí)行 docker push somenzz/my-kali 上傳本地鏡像。docker pull somenzz/my-kali 即可下載你上傳的鏡像來使用。(py38env)????~?docker?tag?my-kali?somenzz/my-kali
(py38env)????~?docker?images
REPOSITORY???????????????TAG?????????????????IMAGE?ID????????????CREATED?????????????SIZE
my-kali??????????????????latest??????????????975cbe3a4619????????14?minutes?ago??????1.83GB
somenzz/my-kali??????????latest??????????????975cbe3a4619????????14?minutes?ago??????1.83GB
my_ubuntu_image??????????latest??????????????3ae070a40b8d????????24?minutes?ago??????171MB
kali?????????????????????latest??????????????c9c07bf9ce32????????2?days?ago??????????1.74GB
ubuntu???????????????????latest??????????????bb0eaf4eee00????????7?days?ago??????????72.9MB
(py38env)????~?docker?push?somenzz/my-kali
The?push?refers?to?repository?[docker.io/somenzz/my-kali]
4ed57b65cfb6:?Pushed
8baabf99a4c6:?Pushing??1.629GB/1.629GB
8e0f65c626fe:?Pushing??102.7MB/113.8MB
......
步驟 8:管理本地鏡像和容器
docker?save?-o?my_ubuntu.tar?ubuntu
docker?import?my_ubuntu.tar?my-ubuntu
docker?export?containerID/containerName?>?/home/export.tar
docker?ps?-a
docker?ps?-l
docker?inspect?image-name
docker?inspect?container-name/containerID
docker?inspect?-f?'{{.Id}}'?container-name/containerID
docker?inspect?-f?'{{.State.Pid}}'?container-name/containerID
docker?inspect?-f?'{{.NetworkSettings.IPAddress}}'?container-name/containerID
docker?inspect?-f?'{{.NetworkSettings.Gateway}}'?container-name/containerID
docker?inspect?-f?'{{.NetworkSettings.MacAddress}}'?container-name/containerID
docker?stop?containerID/container-name
docker?kill?$(docker?ps?-a?-q)
docker?start?containerID/container-name
docker?stop?containerID/container-name
docker?rm?containerID/container-name
docker?kill?$(docker?ps?-a?-q)?docker?rm?$(docker?ps?-a?-q)
docker?rmi?image-name
系統(tǒng)性的 docker 學(xué)習(xí)資料
docker 官方文檔: https://docs.docker.com/
docker 官方博客: https://www.docker.com/blog/
docker 中文社區(qū): https://www.docker.org.cn/
動手玩docker:網(wǎng)易云免費課堂
容器比虛擬機(jī)的優(yōu)勢
小結(jié)
評論
圖片
表情
