手摸手,带你入门docker
步骤 0: linux 非 root 用户使用 docker
$ wget -qO- https://get.docker.com/ | sh
$ sudo usermod -aG docker aaron #这里的aaron是用户名
$ #然后重新登陆
docker help 命令
的形式查看其帮助信息,这个技能必须会,比用的时候再去网上找样例要高效的多。请牢记这一点,现在如果看不懂没关系,假以时日,你自然能看懂帮助信息。步骤 1:下载镜像文件
docker search ubuntu
看看,一般情况下选择第一个即可,或者根据 star 的数量、官方标志来选择,记住选择的镜像名字,这里是 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]
,可以看到中括号包起来的是可选的,没有包起来的都是必输的,名称后面可以加个冒号和标签,就可以下载该名称下某个具体标签的镜像,如果不写 tag,那就默认下载最新的。步骤 2:查看镜像文件,修改镜像存放位置
docker images
:~/Library/Containers/com.docker.docker
路径下,docker info
命令查看 Docker 默认的存储路径,通常位于:/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 则创建该路径
sudo vim docker-overlay.conf # 如果没有则创建该文件
# 在文件中添加如下内容:
# [Service]
# ExecStart=
# ExecStart=/usr/bin/dockerd --graph="新的存储路径" --storage-driver=overlay
# 启动 docker
sudo service docker start
步骤 3:运行容器
docker run ubuntu
docker images
中对应的 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
退出容器,如果想再次进入该容器,先使用 docker ps -a
查看容器状态,如果容器状态为退出,则需要先使用 docker start
启动容器,再使用 exec 命令进入一个正在运行的容器。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:复制文件,路径映射
(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:网络配置、端口映射
--network string
参数来指定四种网络模式:bridge(默认)、host、none、container。执行 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 端口被映射在了宿主机的 38022 端口,我们可以直接 ssh root@localhost -p 38022
来进入容器。如果要登陆成功,这里有个前提, ubuntu 容器已经开启 ssh 服务,允许 root ssh 远程登陆,且你知道 root 密码。docker run -it -p 38022:22 -p 38080:80 --name='my-ubuntu-4' ubuntu /bin/bash
-P
来实现将容器内部开放的网络端口随机映射到宿主机的一个端口上docker port container_ID
可以查看容器的端口映射情况:(py38env) ➜ ~ docker port 805d8ef4b504
22/tcp -> 0.0.0.0:38022
(py38env) ➜ ~
--network host
表示容器与宿主机共用网卡、路由等。并且该容器不会分配自己的 IP 地址。如果在容器中运行一个监听端口 80 的应用,则该容器的应用在宿主机主机 IP 地址上的端口 80 上可用。步骤 6:自定义镜像:保存修改后的容器至新的镜像
docker commit 容器id 镜像名称
docker rm
来删除容器,那么对该容器的修改一直有效,但通常情况下,我们对容器作出一些修改,是为了给别人用,比如将自己的程序部署在容器中打包成镜像,目的是为了发布出去方便别人直接使用。那么就需要将对容器的修改保存为新的镜像。(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:发布镜像
docker tag my-kali somenzz/my-kali
给已存在的镜像打个标签,然后执行 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
系统性的 docker 学习资料
docker 官方文档: https://docs.docker.com/
docker 官方博客: https://www.docker.com/blog/
docker 中文社区: https://www.docker.org.cn/
动手玩docker:网易云免费课堂
容器比虚拟机的优势
小结
评论