该系列文章的目的旨在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 导出和导入镜像操作

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

docker export [container ID] >ubuntu2004_custom.tar

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

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

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 命令大全

Linux docker(01) 基础操作相关推荐

  1. Linux介绍和基础操作

    文章目录 操作系统Linux Linux基础知识 1. Linux 的概述 2. Linux 的历史 3. Linux系统的应用 3.1 服务器系统 3.2 嵌入式系统 3.3 桌面应用系统 3.4 ...

  2. linux echo写php编码,linux使用和基础操作(示例代码)

    1.linux系统初使用 linux有图形终端和字符终端,关于linux学习以字符终端为主,即命令行操作: [root@centos7 ~]#runlevel 查看当前工作模式 N 3 //3为字符终 ...

  3. 【docker】基础操作

    目录 1.在根目录下创建文件:Dockerfile 2.创建docker镜像 3.容器测试运行 4.修改容器中的代码 5.创建基础镜像 6.基于基础镜像创建新的镜像 7.删除镜像 1.在根目录下创建文 ...

  4. linux下的基础操作

    Xfce 终端: Linux 命令行终端,打开后会进入 zsh Shell 环境,可以使用 Linux 命令. NetSurf 网络浏览器:浏览器,可以用在需要前端界面的课程里,只需要打开环境里写的 ...

  5. Linux下PostgreSQL基础操作

    为什么80%的码农都做不了架构师?>>>    PostgreSQL一直以为是一个和sqlite一个级别的数据库,但是在查询之后,自己的态度就完全变了,mysql被oricle公司收 ...

  6. linux mysql服务基础操作(二)

    本文转自 jin626889 51CTO博客,原文链接:http://blog.51cto.com/zuoshou/1575633,如需转载请自行联系原作者

  7. Docker基础操作,原来这才是正确打开Docker的新方式!

    文章目录 前言 一.Docker操作镜像 1.拉取镜像 2.查看镜像 3.删除镜像 4.保存镜像 5.读取镜像 5.镜像帮助命令 二.Docker容器基础操作 1.创建并运行容器 2.查看容器运行状态 ...

  8. linux1.0内核下载,《Linux 0.01 内核分析与操作系统设计》(Linxu 0.01Source)

    中文名: Linux_0_01_内核分析与操作系统设计 英文名: Linxu 0.01Source 发行时间: 2003年 地区: 大陆 对白语言: 普通话 简介: 清华 卢军<Linux0.0 ...

  9. Linux下Mysql数据库的基础操作

    Linux下Mysql数据库的基础操作 一.Mysql数据介绍 二.数据库相关术语介绍 1.数据库相关名词 2.相关术语介绍 三.Mysql数据库的管理 1.创建数据库用户 2.查询用户状态 3.修改 ...

最新文章

  1. netfilter的笔记3--那些内置的表
  2. LeetCode - 413. Arithmetic Slices - 含中文题意解释 - O(n) - ( C++ ) - 解题报告
  3. ViewPager+TabLayout
  4. CodeForces - 1366E Two Arrays(组合数学+思维)
  5. qt-重写event(),事件过滤器,定时器,事件总结
  6. Codeforces Round #601 (Div. 2)
  7. leetcode-54 螺旋矩阵
  8. 技术人员兼职招聘平台HourlyHerd融资2200万美元C轮融资
  9. httpd svn 编译安装_CentOS 6 编译安装Subversion-1.8.10+Apache2.4
  10. MySql 实现Row_Number(Partition by)分组函数效果
  11. html在线测试 css,HTML+CSS测试
  12. VALSE学习(八):矿视-轻量级深度模型的研究与实践
  13. 磁力搜索引擎ZSKY一键安装包
  14. cholesky分解_FM因子分解机的原理、公式推导、Python实现和应用
  15. 启动不了 驱动程序签字功能,bios关闭驱动数字签名 如何在bios禁用驱动程序签名,装系统,启动行为那个无效?...
  16. 鼠标不能再Linux命令界面滚动,电脑鼠标不能上下滚动的解决方法
  17. Html 5 、Android、iOS 全平台的斗地主游戏全程讲解
  18. android mysql 驱动_Java-使用com.mysql.jdbc.Driver的Android MySQL
  19. 10个常用的JS工具库
  20. 十大不良习惯损害大脑

热门文章

  1. Android anr介绍
  2. 英语配音软件哪个好?快把这些软件收好
  3. 阿里云虚拟主机部署多个网站
  4. 苹果手机上网很慢_豁然开朗!原来手机网络信号不好是这么回事!
  5. Android进阶之路 - 批量下载、缓存图片
  6. 3dmax室内设计,建筑视频
  7. 实现手机卡套餐一系列的类的封装
  8. web渗透测试----32、HTTP Parameter Pollution(HTTP参数污染)
  9. 真香!微软出 Go 语言教程了(中文版)
  10. smalldatetime类型