侧边栏壁纸
  • 累计撰写 93 篇文章
  • 累计创建 85 个标签
  • 累计收到 9 条评论

docker初级篇 - docker基本命令使用

bearjun
2021-05-20 / 0 评论 / 0 点赞 / 749 阅读 / 6,549 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2021-05-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1.什么是 Docker

53541-59bmnvq32ef.png

Docker是一个用于开发,交付和运行应用程序的开放平台。 Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件。 借助Docker,您可以以与管理应用程序相同的方式来管理基础架构。 通过利用Docker的快速交付,测试和部署代码的方法,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
官方给Docker的定位是一个应用容器平台。

2.为什么是Docker

  • 合作开发的时候,在本机可以跑,别人的电脑跑不起来
    这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、spring等等。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序直接打包成镜像,直接运行在容器中即可。
  • 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了
    这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。
  • 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器
    在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。

3.Docker和虚拟机区别

关于Docker与虚拟机的区别,我在网上找到的一张图,非常直观形象地展示出来,话不多说,直接上图。
30293-gxqqq81or29.png
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。Docker是不携带操作系统的,所以Docker的应用就非常的轻巧。
另外在调用宿主机的CPU、磁盘等等这些资源的时候。拿内存举例,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。

|传统虚拟机|Docker容器
:--:|:--:|:--:
磁盘占用|几个GB到几十个GB左右|几十MB到几百MB左右
CPU内存占用|虚拟操作系统非常占用CPU和内存|Docker引擎占用极低
启动速度|(从开机到运行项目)几分钟|(从开启容器到运行项目)几秒
安装管理|需要专门的运维技术|安装、管理方便
应用部署|每次部署都费时费力|从第二次部署开始轻松简捷
耦合性|多个应用服务安装到一起,容易互相影响|每个应用服务一个容器,达成隔离
系统依赖||需求相同或相似的内核,目前推荐是Linux

4.Docker 的核心

64261-f2f5p5wh7yo.png

  • 镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
  • 容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
  • 仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
  • dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像

5.Docker的安装(centos7.x)

5.1 卸载原有 docker

$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

5.2 安装docker

安装docker依赖

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

设置docker的yum源

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装最新版的docker

$ sudo yum install docker-ce docker-ce-cli containerd.io

指定版本安装docker

$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
$ sudo yum install docker-ce-18.09.5-3.el7 docker-ce-cli-18.09.5-3.el7 containerd.io

启动docker

$ sudo systemctl start docker

关闭docker

$ sudo systemctl stop docker

测试docker安装

$ sudo docker run hello-world

6. Docker 配置阿里镜像加速服务

6.1 docker 运行流程

89448-eze1ba63n9t.png

6.2 docker配置阿里云镜像加速

  • 访问阿里云登录自己账号查看docker镜像加速服务
    说明:自己登陆阿里云,找到容器镜像服务=>镜像加速器,粘贴相关代码
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  • 验证docker的镜像加速是否生效
[root@localhost ~]# docker info
 ..........
 Kernel Version: 4.18.0-193.6.3.el8_2.x86_64
 Operating System: CentOS Linux 8 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 1
 Total Memory: 1.784GiB
 Name: VM-0-17-centos
 ID: 6LIY:4PZW:4UO3:CCUE:OQIP:4OP6:MCCX:MB4K:Q34C:T5O4:YW4O:AEE5
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://xxxxxxxxx.mirror.aliyuncs.com/
 Live Restore Enabled: false

7.Docker的入门应用

7.1 docker 的第一个程序

docker  run hello-world
[root@localhost ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
For more examples and ideas, visit:
 https://docs.docker.com/get-started/

8.常用命令

8.1 辅助命令

1.安装完成辅助命令

# 查看docker的信息
docker version
# 查看更详细的信息
docker info
# 帮助命令
docker --help 

8.2 Images 镜像命令

1.查看本机中所有镜像

# 列出本地所有镜像
docker images [-a -q]
# -a 列出所有镜像(包含中间映像层)
# -q 只显示镜像id

2.搜索镜像

# 去dockerhub上查询当前镜像
docker search [options] 镜像名
# 列出收藏数不少于指定值的镜像 -s 指定值   
# 显示完整的镜像信息 --no-trunc  

3.从仓库下载镜像

# 下载镜像
docker pull 镜像名[:TAG|@DIGEST]

4.删除镜像

# 删除镜像
docker rmi 镜像名 [-f]
# -f 强制删除

8.3 Contrainer 容器命令

8.3.1 基本命令(容器外操作)

1.运行容器

# 镜像名新建并启动容器
docker run 镜像名 [--name -d -p ]  
# --name 别名为容器起一个名字
# -d 启动守护式容器(在后台启动容器)
# -p 映射端口号:原始端口号      指定端口号启动
# 例:docker run -it --name myTomcat -p 8888:8080 tomcat
#     docker run -d --name myTomcat -P tomcat

2.查看运行的容器

# 列出所有正在运行的容器
docker ps [-a -q]  
# -a 正在运行的和历史运行过的容器
# -q 静默模式,只显示容器编号

3.停止|关闭|重启容器

# 开启容器
docker start   容器名字或者容器id
# 重启容器
docker restart 容器名或者容器id
# 正常停止容器运行
docker stop  容器名或者容器id
# 立即停止容器运行
docker kill  容器名或者容器id

4.删除容器

docker rm -f 容器id和容器名   
# 删除所有容器
docker rm -f $(docker ps -aq)

5.查看容器内进程

# 查看容器内的进程
docker top 容器id或者容器名

6.查看查看容器内部细节

# 查看容器内部细节
docker inspect 容器id

7.查看容器的运行日志

# 查看容器日志
docker logs [OPTIONS] 容器id或容器名
# -t 加入时间戳
# -f 跟随最新的日志打印
# --tail 数字 显示最后多少条

8.3.2 进阶命令(容器内数据交互)

centos ----> docker(引擎) ----> mynginx(容器)

1.进入容器内部

# 进入容器执行命令
docker exec [options] 容器id 容器内命令
# -i 以交互模式运行容器,通常与-t一起使用
# -t 分配一个伪终端    shell窗口   /bin/bash 

2.容器内安装软件

apt-get update
apt-get install 安装包名称

3.修改容器内文件

4.退出容器

#退出容器
exit        

5.将容器打包为新的镜像

docker commit -a="作者" -m="描述信息" 容器ID 目标镜像名称:TAG

6.从容器中复制文件到宿主机目录中

# 将容器内资源
拷贝到主机上
docker cp 容器id:容器内资源路径 宿主机目录路径

7.设置容器和宿主机共享目录

docker run -it -v /宿主机的路径:/容器内的路径:ro(只读) 镜像名

注意: 宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
运行 docker inspect 容器id 命令 检查json串里有没有以下内容,如果有则证明卷挂载成功。

"Mounts": [
    {
        "Type": "bind",
        "Source": "/hostDataValueme",
        "Destination": "/containerDataValueme",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
]

8.打包镜像

docker save 镜像名 -o  名称.tar

9.载入镜像

docker load -i   名称.tar

9.docker的镜像原理

9.1 镜像是什么?

镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。

9.2 为什么一个镜像会那么大?

22406-97d19svrr1.png
镜像就是花卷

  • UnionFS(联合文件系统):
  • Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。这种文件系统特性:就是一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录 。

9.3 Docker镜像原理

docker的镜像实际是由一层一层的文件系统组成。

  • bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
  • rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
  • 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
    83957-r1ks24j5shh.png

9.4 为什么docker镜像要采用这种分层结构呢?

最大的一个好处就是资源共享

  • 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
0

评论区