欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CLOUD04 - Docker环境部署 Docker镜像、Docker基本命令

程序员文章站 2022-03-05 22:12:37
...

一、Docker概述

1.1 概述

1.1.1 什么是容器

• 容器技术已经成为应用程序封装和交付的核心技术
• 容器技术的核心有以下几个内核技术组成:
– CGroups(Control Groups)-资源管理
– NameSpace-进程隔离
– SELinux安全
• 由于是在物理机上实施隔离,启动一个容器,可以像
启动一个进程一样快速

1.1.2 什么是Docker

docker的核心应用是打包应用程序环境,docker是应用交付的核心技术

• Docker是完整的一套容器管理系统  
• Docker提供了一组命令,让用户更加方便直接地使
用容器技术,而不需要过多关心底层内核技术

1.2 Docker特性

1.2.1 Docker优点

• 相比于传统的虚拟化技术,容器更加简洁高效
• 传统虚拟机需要给每个VM安装操作系统
• 容器使用的共享公共库和程序

CLOUD04 - Docker环境部署 Docker镜像、Docker基本命令     CLOUD04 - Docker环境部署 Docker镜像、Docker基本命令

1.2.2 Docker的缺点

• 容器的隔离性没有虚拟化强
• 共用Linux内核,安全性有先天缺陷

二、部署Docker

2.1 安装前准备

1.需要64位操作系统
~ ] # getconf LONG_BIT

2.至少RHEL6.5以上的版本,强烈推荐RHEL7
~]# cat /etc/redhat-release 

3.关闭禁用防火墙(不是必须)
~]# systemctl stop firewalld
~]# systemctl mask firewalld    //禁用防火墙

4.禁用 selinux
~]# vim /etc/selinux/config
SELINUX=disabled

5. 修改主机名和静态 ip 地址
~ ] echo docker1 >/etc/hostname
配置静态 ip 地址 /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=”static”
IPADDR=”192.168.1.11”
NETMASK=”255.255.255.0”
GATEWAY=”192.168.1.254”

2.2 安装docker

2.2.1配置 yum 源

下载docker.tar.gz,提取两个rpm包。把这两个rpm压缩包放到一个文件夹下,再通过createrepo . 生成自定义yum源。

最后客户端编写repo文件就可以实现客户端使用

  1. [local_docker]
  2. name=CentOS-$docker - Base
  3. baseurl=“ftp://192.168.5.254/docker”
  4. enabled=1
  5. gpgcheck=0

2.2.2 安装 docker

~] # yum install docker-engine

2.2.3 启动docker服务并查看版本

docker1 ~]# systemctl restart docker    //启动docker服务

docker1 ~]# systemctl enable docker    //让docker服务开机自启

docker1 ~]#  ifconfig  启动后可以看见 docker0 

docker1 ~]#  docker version

三、Docker镜像

3.1 基本概念

3.1.1 什么是镜像

• 在Docker中容器是基于镜像启动的
• 镜像是启动容器的核心
• 镜像采用分层设计
• 使用快照的COW技术,确保底层数据不丢失

CLOUD04 - Docker环境部署 Docker镜像、Docker基本命令

3.1.2 Docker hub镜像仓库

• Docker官方提供公共镜像的仓库(Registry)     https://hub.docker.com

1.搜索公共镜像仓库的docker镜像

[aaa@qq.com ~]# docker search rhel7

[aaa@qq.com ~]# docker search centos

[aaa@qq.com ~]# docker search nginx

[aaa@qq.com ~]# docker search mysql

3.2 镜像操作

3.2.1 下载、上传镜像

1.下载镜像(从镜像仓库中下载镜像)

[aaa@qq.com ~]# docker help pull
         docker pull [OPTIONS] NAME[:TAG|@DIGEST]
[aaa@qq.com ~]# docker pull rhel7

2.上传镜像(上传镜像到仓库)
[aaa@qq.com ~]# docdocker help push
          Usage: docker push [OPTIONS] NAME[:TAG]
[aaa@qq.com ~]# docker push rhel7

3.2.2 导入、导出镜像

1.导入镜像(通过tar包文件导入镜像)
[aaa@qq.com ~]# docker load < xx.tar
[aaa@qq.com ~]# docker images

2.导出镜像(将本地镜像导出为tar文件)
[aaa@qq.com ~]# docker images
[aaa@qq.com ~]# docker save image_name > xx.tar

3.2.3 启动镜像

1.启动centos镜像生成一个容器
[aaa@qq.com ~]# docker images
[aaa@qq.com ~]# docker run -it centos bash
2.开启另一个终端(查看容器信息)
[aaa@qq.com ~]# docker ps

四、Docker基本命令

4.1 镜像常用命令

4.1.1 命令列表

1.命令列表
– docker images //查看镜像列表
– docker history //查看镜像制作历叱
– docker inspect //查看镜像底层信息
– docker pull //下载镜像
– docker push //上传镜像
– docker rmi //删除本地镜像
– docker save //镜像另存为tar包
– docker load //使用tar包导入镜像
– docker search //搜索镜像
– docker tag //修改镜像名称和标签

4.1.2 docker images

1. 查看镜像列表
docker1 ~]# docker images
镜像仓库名称    镜像标签   镜像ID                   创建时间             大小
centos                latest         980e0e4c79ec   8 months ago    196.7 MB

4.1.3 docker history      

1.查看镜像历史,了解镜像制作过程
docker1 ~]# docker history centos

4.1.4 docker inspect

1.查看镜像底层信息
– 了解镜像环境变量、存储卷、标签等信息

docker1 ~]# docker inspect centos

4.1.5 docker rmi

1.删除本地镜像
– 注意:启动容器时删除镜像会提示错误

[aaa@qq.com ~]# docker rmi centos
Error response from daemon: conflict: unable to remove repository reference “centos” (must force) - container 0143d0aeee25 is using its referenced image e934aafc2206

2.如需强制删除,可以加-f选项

[aaa@qq.com ~]# docker rmi -f centos

Untagged: centos:latest

4.1.6 docker save|load

1.保存本地镜像另存为tar文件
– 方便其他人使用tar包导入镜像

~]# docker save nginx:latest > nginx.tar

~]#  ls  nginx.tar

~]# scp nginx.tar 192.168.5.141:/root/                 //把nginx.tar包传给远程机器

2.使用tar包文件导入镜像

docker2 ~]# docker load < nginx.tar                    //在远程机器上导入tar包

docker2 ~]#  docker images

4.1.7 docker tag

1.重命名镜像名称(复制)

~  ] # docker images          //查看所有镜像

~  ]# docker tag centos:latest test:v1     //centos:latest 和test:v1的ImageID是一样的,说明他们是同一个镜像的不同标示

~  ] #  docker rmi centos     //删除原有镜像的标示就实现了镜像重命名

4.2容器常用命令

4.2.1 命令列表

• 命令列表

– docker run //运行容器
– docker ps //查看容器列表
– docker stop //关闭容器
– docker start //启动容器
– docker restart //重启容器
– docker attach|exec //进入容器
– docker inspect //查看容器底层信息
– docker top //查看容器进程列表
– docker rm //删除容器

4.2.2 docker run

1.使用镜像启动容器

[aaa@qq.com ~]# docker run -it centos bash
[aaa@qq.com /]#exit
[aaa@qq.com ~]# docker run -itd centos bash
b8f218f2341c12655e6092d7d2e7fd5229824fdefce84075fb3a9569ebf82079
[aaa@qq.com ~]# docker ps

问题:docker run -it  nginx  没响应?
因为 nginx 启动的默认 cmd 时 nginx daemon,该进程不是一个交互式的进程

2.docker run 使用
-i   交互式的
-t   分配终端
-d  把容器放在后台运行

启动的进程是非交互进程需要用-d启动,启动的进程是交互式进程需要用-it启动

~] # docker  run  -it    centos   cmd    //启动一个centos交互式的容器,在前台运行

~] #  docker  run -d     nginx              //启动nginx服务   

小练习: 启动一个 nginx 的容器,修改默认首页为 “hello world”

1.创建一个nginx容器

[aaa@qq.com ~]# docker run -itd nginx       
0dfd8f93df995813eecc9a174e54f77a3817f297a3b8147b02199c7c9cdd837f

2.连接到指定CONTAINER ID nginx的容器

~]# docker exec -it 0dfd8f93df995813eecc9a174e54f77a3817f297a3b8147b02199c7c9cdd837f bash  

3.查找index.html所在路径

aaa@qq.com:/# find / -name index.html 
/usr/share/nginx/html/index.html

4.修改主页内容为hello world

aaa@qq.com:/# echo “hello world” > /usr/share/nginx/html/index.html 

5.查看容器IP

aaa@qq.com:/#  ip a           

172.17.0.2

6.退出容器,在docker1*问nginx主页

docker1 ~]# curl 172.17.0.2

4.2.3 docker ps

1.列出容器列表
– docker ps 查看正在运行的容器
– docker ps -a 查看所有容器列表
– docker ps -aq 仅显示容器id

~]# docker ps  [-qa]

4.2.4 docker stop|start|restart

• 管理容器
– docker stop 关闭容器
– docker start 开启容器
– docker restart 重启容器

~]# docker stop CONTAINER ID

4.2.5 docker attach|exec

1.进入容器
– docker attach 进入容器,exit会导致容器关闭
– docker exec 进入容器,退出时不会关闭容器    【生产环境中用 docker  exec连接容器】

[aaa@qq.com ~]# docker ps

[aaa@qq.com ~]# docker attach b8f
[aaa@qq.com ~]# docker exec -it 7e4e bash

Q1:如果我使用attach 连接容器后,怎么才能不结束容器?
解决方法:把容器放后台,使用快捷键 ctrl + pq

Q1:attach 为什么退出后,容器会结束?

因为 attach 连接进容器的 pid 1 的进程,当 attach 结束时候,pid 为 1 的进程被结束
所有整个容器被销毁

[aaa@qq.com /]# ps  //在容器里执行ps命令,bash的pid是1。这是一个上帝进程,一旦退出,PID为1的进程就退出了,整个容器就结束了,所以我们需要把容器放入后台
  PID TTY          TIME CMD
    1 ?        00:00:00 bash

4.2.6 docker inspect

1.查看容器底层信息
[aaa@qq.com ~]# docker ps
[aaa@qq.com ~]# docker inspect 21d2aeb977cc

2.查看指定容器的IP地址

docker inspect -f ‘{.NetworkSettings.IPAddress}’ 21d2aeb977cc

4.2.7  docker top

1.查看容器进程列表

docker1 ~]# docker ps  

docker1 ~]# docker top 7e4e   //不用进入容器查看容器里面的进程,相当于在容器里执行ps

4.2.8 docker rm

1.删除容器
– 注意,删除正在运行的容器时会提示错误
[aaa@qq.com ~]# docker rm 7e4e
[aaa@qq.com ~]# docker rm (dockerstop(docker ps -aq))

 

五、常见问题

5.1 删除容器

• 删除容器,提示错误:
– docker rm 0cc
Error response from daemon: You cannot remove a
running container
0cc385eb6f63373397e678347890914347dc8efa3cef
d809c1ed8c157651a261. Stop the container before
attempting removal or use -f

5.2故障分析及排除

• 原因分析
– 问题1:提示error:You cannot remove a runningcontainer
• 解决办法
– 问题1:先关闭容器,才能删除容器