Linux docker(01) 基础操作

该系列文章的目的旨在docker的基础学习和docker的实战应用。

0 why docker

在这之前我们需要了解为啥要使用docker这个东东?简单来说:

  • 这玩意儿根虚拟机功能差不多,但比虚拟机快,而且相对来说占用空间和资源少,当然功能也少,不过呢,都是自己定制的,可以说是资源最大化的利用。
  • 一次构建,永久使用,构建完了导出个包,以后就在也不用为环境配置这些愁了,把心思都放在重要的coding的事情上。

1 docker的安装与卸载

1.1 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版本相关的信息。

1.2 docker的卸载

#删除安装报相关信息
sudo apt-get purge docker-ce
#删除镜像和配置文件等
sudo rm -rf /var/lib/docker

2 docker下载镜像 与 运行镜像

2.1 下载镜像

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

2.2 运行镜像

运行镜像常见的是run和exec两个命令操作。两者在参数上基本相差不大,区别在于:

  • run是根据镜像创建一个容器并运行一个命令,操作的对象是 镜像。
  • exec是是针对已经运行的容器中执行的命令,操作的对象是 容器。

2.2.1 run命令

@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在平时使用中最常用的一些参数

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • --name="nginx-lb": 为容器指定一个名称;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • --volume / -v: 绑定一个卷,用于docker和host主机共享文件操作

2.2.2 exec命令

@1 exec基本操作

在这里相关参数和run一样,不同之处在于run针对镜像,而exec针对docker容器,一般执行如下:

$sudo docker exec -it 0a34bdfb87f7 /bin/bash
root@0a34bdfb87f7:/# 

@2 exec常见参数

  • -d :分离模式: 在后台运行,同run命令
  • -i :即使没有附加也保持STDIN 打开,同run命令
  • -t :分配一个伪终端,同run命令

除了使用exec,对于一个正在使用的容器,如果我们不改变进入的相关参数,那么也可以使用attach操作。

2.2.3 容器状态控制和连接容器

对于运行中的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

2.2.4 获取运行时日志

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命令常见参数有:

  • -f : 跟踪日志输出
  • --since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • --tail :仅列出最新N条容器日志

3 docker 文件传输与共享文件设置

3.1 文件传输

从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/

3.2 共享文件设置

对于业务层的需求,一般共享文件是少不了的,比如我们编译代码和编译环境做了隔离和解耦合,但是使用环境编译代码时就需要共享文件机制 把代码挂载到docker中。该机制的实现核心就在于run命令的-v选项,一般在执行run命令时加上-v选项 绑定数据卷,如下:

$sudo docker run -v [host主机目录绝对路径]:[docker容器绝对路径] -it ...[其他参数]

也就是镜像生成容器的时候 通过参数确定共享文件位置,同时注意:共享文件可以有多个。

4 构建新的镜像

有了以上的基础,接下来我们就可以根据自己的需要在这个基本镜像上来安装软件,配置环境变量和编写脚本等,构建出新的镜像。那么关于新的镜像可以直接输出成 tar压缩文件,也可以提交到自己的docker仓库,当然这个过程还可以通过DockerFile来构建新的镜像。接下来我们分别看这几种构建新镜像的方式以及提交到自己账号仓库的流程。

4.1 导出和导入镜像操作

@1 export 和import操作

导出操作:导出自定义的ubuntu docker,这样就可以把自定义的镜像给到需要的人,关键命令如下:

docker export [container ID] >ubuntu2004_custom.tar

导入操作:导入ubuntu2004_custom.tar,关键命令如下:

cat [ubuntu2004_custom.tar所在路径] | docker import - [自定义的本地镜像名称]

@2 save和load操作

保存操作,将image_id对应的镜像打包成tar文件,操作如下:

$docker save [OPTIONS] IMAGE [IMAGE...]
$docker save image_id >ubuntu.tar

加载操作,将tar文件加载为docker image镜像中,操作如下:

$docker load [OPTIONS]
$docker load < ubuntu.tar

4.2 DockerFile

因为Dockerfile的命令还是很多的,这里先给出最小的构建方法,了解Dockerfile怎么用?

@1 在空白目录下,编辑文件 Dockerfile,内容如下:

FROM ubuntu_wds2
RUN apt update
RUN apt install vim tree

@2 执行命令:

$docker build -t dockerfile_image

实际上Dockerfile构建镜像可以理解为 自动化脚本的构建。一个最简单的Dockerfile构建新镜像的流程就结束了,当然,实际使用中相关命令需要查手册:Dockerfile命令集

4.3 docker commit 提交 并提交到docker仓库

4.3.1 docker commit

docker commit 提交命令如下:

#docker commit [OPTIONS] [CONTAINER ID] [REPOSITORY[:TAG]]
$docker commit -a "wangdsh" -m "commit description" a404c6c174a2 myubuntu2004:v2 
sha256:577647a40bc02c0885f1544e8886be23010b66a6600b33ee2805737af1236ade

相关参数说明如下:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

之后执行docker images 可以看到提交的新镜像:

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myubuntu2004        v2                  36af12def37a        17 seconds ago      486 MB

该命令可以持续提交,用于临时保存,当本地工作完成后,最后的版本可以直接push到自己的docker仓库里了。

4.3.2 docker push 提交到仓库

如果要提交到自己账号的仓库,就县注册一个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是一个套路阿。

5 docker基本命令手册

以上介绍了docker常见的基本命令,当然不够全面,因此这里给出一个相对全面的命令手册,链接如下:Docker 命令大全

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值