该系列文章的目的旨在docker的基础学习和docker的实战应用。
在这之前我们需要了解为啥要使用docker这个东东?简单来说:
执行以下3条关键命令即可:
- curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
- sudo apt install docker-ce docker-ce-cli containerd.io
执行验证下docker的安装:
- $ docker -v
- Docker version 20.10.17, build 100c701
这里会输出docker版本相关的信息。
- #删除安装报相关信息
- sudo apt-get purge docker-ce
- #删除镜像和配置文件等
- sudo rm -rf /var/lib/docker
docker的官方镜像网址:Docker Hub
打开后是这样的:

根据自己的需要选择对应的docker即可。除了网站也可以在本地直接进行搜索,关键命令为:
- #docker search [关键词]
- $docker search ubuntu
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- ubuntu Ubuntu is a Debian-based Linux operating sys… 14820 [OK]
- websphere-liberty WebSphere Liberty multi-architecture images … 288 [OK]
- ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
- neurodebian NeuroDebian provides neuroscience research s… 92 [OK]
- ubuntu/nginx Nginx, a high-performance reverse proxy & we… 57
- open-liberty Open Liberty multi-architecture images based… 54 [OK]
- ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 46 [OK]
- ubuntu/apache2 Apache, a secure & extensible open-source HT… 40
- ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
- kasmweb/ubuntu-bionic-desktop Ubuntu productivity desktop for Kasm Workspa… 31
- ubuntu/squid Squid is a caching proxy for the Web. Long-t… 30
- ubuntu/prometheus Prometheus is a systems and service monitori… 28
- ubuntu/bind9 BIND 9 is a very flexible, full-featured DNS… 25
- ubuntu/postgres PostgreSQL is an open source object-relation… 19
- ubuntu/redis Redis, an open source key-value store. Long-… 11
- ubuntu/kafka Apache Kafka, a distributed event streaming … 10
- ubuntu/prometheus-alertmanager Alertmanager handles client alerts from Prom… 6
- ubuntu/grafana Grafana, a feature rich metrics dashboard & … 6
- ubuntu/memcached Memcached, in-memory keyvalue store for smal… 5
- ubuntu/zookeeper ZooKeeper maintains configuration informatio… 5
- ubuntu/telegraf Telegraf collects, processes, aggregates & w… 4
- ubuntu/cortex Cortex provides storage for Prometheus. Long… 3
- ubuntu/cassandra Cassandra, an open source NoSQL distributed … 2
- ubuntu/dotnet-deps Chiselled Ubuntu for self-contained .NET & A… 2
- ubuntu/loki Grafana Loki, a log aggregation system like … 0
下载镜像一般使用docker pull操作,比如:
- #拉官方ubuntu20.04容器
- docker pull ubuntu:20.04
下载完镜像后,执行
- $sudo docker images
- 等价于
- $sudo docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- ubuntu 20.04 3bc6e9f30f51 2 weeks ago 72.8MB
运行镜像常见的是run和exec两个命令操作。两者在参数上基本相差不大,区别在于:
@1 run基本操作
至此,docker的images镜像就下载下来了,但镜像只是静态的,就好比windows和linux的 镜像安装文件一样,想让其运行起来就需要执行docker run操作,如下:
- #test docker run
- $docker run ubuntu:20.04 /bin/echo "Hello docker"
- Hello docker
-
- #docker run
- $sudo docker run -it ubuntu:20.04 /bin/bash
- root@0a34bdfb87f7:/#
运行起来后 可以通过命令:
- $docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 0a34bdfb87f7 ubuntu:20.04 "/bin/bash" 2 minutes ago Up 2 minutes determined_swartz
查看docker的运行状态,同时也可以通过命令:
- $docker stats
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- 0a34bdfb87f7 determined_swartz 0.00% 3.559MiB / 31.24GiB 0.01% 5.59kB / 0B 4.33MB / 0B 1
来查看docker的性能指标,使用了多少CPU和MEM。
@2 run在平时使用中最常用的一些参数
@1 exec基本操作
在这里相关参数和run一样,不同之处在于run针对镜像,而exec针对docker容器,一般执行如下:
- $sudo docker exec -it 0a34bdfb87f7 /bin/bash
- root@0a34bdfb87f7:/#
@2 exec常见参数
除了使用exec,对于一个正在使用的容器,如果我们不改变进入的相关参数,那么也可以使用attach操作。
对于运行中的docker容器的,我们通过container ID对其进行操作,我们通过可以执行
- #docker [start/restart/stop] [container ID]
- $docker start 376b1d358c53 #启动一个或多个已经被停止的容器
- $docker stop 376b1d358c53 #停止一个运行中的容器
- $docker restart 376b1d358c53 #重启容器
来决定容器的运行状态是start还是stop。如果容器的状态是stop则暂时不可用。
如果在容器中执行了exit操作,如下:
- #docker run
- $sudo docker run -it ubuntu:20.04 /bin/bash
- root@0a34bdfb87f7:/# exit
- $
此时如果还想再次进入到docker容器中,则需要执行:
- #docker restart [container ID],确保docker的状态是start
- $docker restart 376b1d358c53
- #再次进入到容器中
- #docker attach [container ID],表示连接到容器
- $docker attach 376b1d358c53
docker logs 是用来获取容器日志的,使用如下:
- #docker logs [OPTIONS] CONTAINER
- $docker logs 376b1d358c53
- 2022-08-22 03:21:08,977 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. If you intend to run as root, you can set user=root in the config file to avoid this message.
- 2022-08-22 03:21:08,977 INFO Included extra file "/etc/supervisor/conf.d/supervisord.conf" during parsing
- 2022-08-22 03:21:08,980 INFO RPC interface 'supervisor' initialized
- 2022-08-22 03:21:08,980 CRIT Server 'unix_http_server' running without any HTTP authentication checking
- 2022-08-22 03:21:08,981 INFO supervisord started with pid 19
- 2022-08-22 03:21:09,985 INFO spawned: 'nginx' with pid 21
- 2022-08-22 03:21:09,988 INFO spawned: 'web' with pid 22
- 2022-08-22 03:21:09,990 INFO spawned: 'xvfb' with pid 23
- 2022-08-22 03:21:09,992 INFO spawned: 'wm' with pid 24
- 2022-08-22 03:21:09,994 INFO spawned: 'lxpanel' with pid 25
- 2022-08-22 03:21:09,996 INFO spawned: 'pcmanfm' with pid 26
- 2022-08-22 03:21:09,998 INFO spawned: 'x11vnc' with pid 27
- 2022-08-22 03:21:10,001 INFO spawned: 'novnc' with pid 28
- 2022-08-22 03:21:10,167 INFO Listening on http://localhost:6079 (run.py:87)
- 2022-08-22 03:21:10,985 INFO success: nginx entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,011 INFO success: web entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,012 INFO success: xvfb entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,012 INFO success: wm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,012 INFO success: lxpanel entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,012 INFO success: pcmanfm entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,012 INFO success: x11vnc entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
- 2022-08-22 03:21:11,013 INFO success: novnc entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
常用的logs命令常见参数有:
从docker传输文件给主机:
- #sudo docker cp [container ID]:/[docker绝对路径] [本地路径]
- $sudo docker cp 52ea915e6527:/root/test.txt /home/test/share/
从主机传输文件给docker中:
- #sudo docker cp [本地路径] [container ID]:/[docker绝对路径]
- docker cp license.dat 52ea915e6527:/root/
对于业务层的需求,一般共享文件是少不了的,比如我们编译代码和编译环境做了隔离和解耦合,但是使用环境编译代码时就需要共享文件机制 把代码挂载到docker中。该机制的实现核心就在于run命令的-v选项,一般在执行run命令时加上-v选项 绑定数据卷,如下:
$sudo docker run -v [host主机目录绝对路径]:[docker容器绝对路径] -it ...[其他参数]
也就是镜像生成容器的时候 通过参数确定共享文件位置,同时注意:共享文件可以有多个。
有了以上的基础,接下来我们就可以根据自己的需要在这个基本镜像上来安装软件,配置环境变量和编写脚本等,构建出新的镜像。那么关于新的镜像可以直接输出成 tar压缩文件,也可以提交到自己的docker仓库,当然这个过程还可以通过DockerFile来构建新的镜像。接下来我们分别看这几种构建新镜像的方式以及提交到自己账号仓库的流程。
导出操作:导出自定义的ubuntu docker,这样就可以把自定义的镜像给到需要的人,关键命令如下:
docker export [container ID] >ubuntu2004_custom.tar
导入操作:导入ubuntu2004_custom.tar,关键命令如下:
cat [ubuntu2004_custom.tar所在路径] | docker import - [自定义的本地镜像名称]
因为Dockerfile的命令还是很多的,这里先给出最小的构建方法,了解Dockerfile怎么用?
@1 在空白目录下,编辑文件 Dockerfile,内容如下:
- FROM ubuntu_wds2
- RUN apt update
- RUN apt install vim tree
@2 执行命令:
$docker build -t dockerfile_image
实际上Dockerfile构建镜像可以理解为 自动化脚本的构建。一个最简单的Dockerfile构建新镜像的流程就结束了,当然,实际使用中相关命令需要查手册:Dockerfile命令集
docker commit 提交命令如下:
- #docker commit [OPTIONS] [CONTAINER ID] [REPOSITORY[:TAG]]
- $docker commit -a "wangdsh" -m "commit description" a404c6c174a2 myubuntu2004:v2
- sha256:577647a40bc02c0885f1544e8886be23010b66a6600b33ee2805737af1236ade
相关参数说明如下:
之后执行docker images 可以看到提交的新镜像:
- $docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- myubuntu2004 v2 36af12def37a 17 seconds ago 486 MB
该命令可以持续提交,用于临时保存,当本地工作完成后,最后的版本可以直接push到自己的docker仓库里了。
如果要提交到自己账号的仓库,就县注册一个docker官方的账号,地址:Docker Hub注册,之后要进入登陆->push操作->登出流程,如下:
- #docker账号登陆,需要用户名和密码
- $docker login
-
- #提交push相关操作
- #注意:push时 镜像格式为:[dockerID]/镜像名
- $docker tag myubuntu2004:v2 [dockerID]/myubuntu:v2
- $docker push [dockerID]/myubuntu:v2
- $docker search [dockerID]/myubuntu
-
- #docker登出
- $docker logout
额外说明:用着用着感觉这个玩意儿根git是一个套路阿。
以上介绍了docker常见的基本命令,当然不够全面,因此这里给出一个相对全面的命令手册,链接如下:Docker 命令大全