一、Docker基础入门这篇文章够用了

  • A+
所属分类:docker

博主:运维Giao

博客:www.giaogg.cn

联系方式:QQ1035587908

交流群:1071386609

一、Docker基本概述与配置安装


Docker概述


首先什么是Docker? Docker是一种Linux容器技术,一种高效、敏捷和轻量级的容器解决方案,并且支持在多种主流平台(pass)和本地部署。Docker是基于GO语言实现的云开源项目,诞生于2013年,最初发起者是dotcloud公司,后来改名为docker inc,之后专注于docker相关技术和产品的开发。Docker项目目前已经加入了Linux基金会,遵循apache2.0开源会议,全部开源代码均在:https://github.com/docker上进行相关维护。现在docker与openstack同为最受欢迎的云计算开源项目。

Docker的内部三大核心概念
(1)镜像docker images:docker镜像时docker容器运行时的只读模板,镜像可以用来创建docker容器。
(2)仓库docker repository:类似代码仓库,它是docker集中存放镜像文件的地方。
(3)容器docker contains:利用容器运行,一个docker容器包含了所有的某个应用运行所需要的环境。
注意:镜像时只读的,容器在启动的时候,创建一层壳作为做上层。

Docker特性:
1、文件系统隔离:每个进程容器运行在一个完全独立的根文件系统里。
2、资源隔离:系统资源,像内存等可以分配到不同的容器中,使用Cgroup。
3、网络隔离:每个进程容器运行在自己的网络空间,虚拟接口和IP地址。4、日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin)用于实时检索或批量检索。
5、变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器,无需使用模板或手动配置。
6、交互式shell,Docker可以分配一个虚拟终端并关联到任何容器的标准输入上。


如何安装Docker


1、安装介绍

(1)环境选择:

  • 操作系统 - centos7.4以上
  • runtime - runc(Docker的默认runtime)
  • 管理工具 - Docker Engine(Docker默认的管理工具)

(2)官网:https://docs.docker.com/

(3)阿里云镜像站:https://mirrors.aliyun.com/docker-ce/
因为官网的镜像时国外,下载速度较慢,所以用国内的镜像站,国内镜像站有:阿里云、腾讯、网易、清华大学

2、安装Docker

(1)查找安装aliyun yum源的地址
一、Docker基础入门这篇文章够用了

docker分为两个版本docker-ce和docker-ee

一、Docker基础入门这篇文章够用了
(2)安装aliyun yum源

[root@localhost ~]# vim /etc/yum.repos.d/docker.repo
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=1
enabled=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
(3)安装docker-ce
[root@localhost ~]# yum install -y docker-ce

启动docker服务
[root@localhost ~]# systemctl start docker

查看版本
[root@localhost ~]# docker --version
Docker version 19.03.12, build 48a66213fe
(4)添加阿里云加速器

阿里云加速器网址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

一、Docker基础入门这篇文章够用了
[root@localhost ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://vmpaj1xg.mirror.aliyuncs.com"]
}

重启docker
[root@localhost ~]# systemctl restart docker

查看具体信息
[root@localhost ~]# docker info
 Registry Mirrors:
  https://vmpaj1xg.mirror.aliyuncs.com/
在底部看到刚才配置的地址,就表示成功了。

如何使用Docker


(1)下载镜像——httpd、centos、busybox
[root@localhost ~]# docker pull httpd
[root@localhost ~]# docker pull centos
[root@localhost ~]# docker pull busybox

查看镜像
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              c7c37e472d31        3 weeks ago         1.22MB
centos              latest              831691599b88        4 weeks ago         215MB
httpd               latest              ccbcea8a6757        6 weeks ago         166MB

当前拉取的centos镜为latest最新版本的,也就是centos8,我们需要将8换成7。

下载centos7镜像
[root@localhost ~]# docker pull centos:7

删除最新版本的centos镜像
[root@localhost ~]# docker rmi centos:latest #文件名:版本号

镜像改名
[root@localhost ~]# docker tag centos:7 centos:latest、
[root@localhost ~]# docker rmi centos:7
Untagged: centos:7

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              c7c37e472d31        3 weeks ago         1.22MB
httpd               latest              ccbcea8a6757        6 weeks ago         166MB
centos              latest              b5b4d78bc90c        2 months ago        203MB

将镜像保存到本地——镜像导出
[root@localhost ~]# docker save -o centos.tar centos:latest
[root@localhost ~]# ls
centos.tar #当前目录出现一个打包的镜像

然后将本地的这个镜像上传到docker里面——镜像导入
[root@localhost ~]# docker rmi centos:latest
[root@localhost ~]# docker load < centos.tar 
(2)镜像搜索
一、Docker基础入门这篇文章够用了
Offical OK:表示官方出品
dorowu/ubuntu-desktop-lxde-vns:镜像谁创造的/这个镜像含有什么
(3)容器的介绍与运行
[root@localhost ~]# docker run centos echo "运维Giao"
运维Giao

输出的运维Giao,不是服务器本身echo得到的,是在容器运行的。

容器是Docker的另一个核心概念,简单说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,容器就是独立运行的一个或一组应用以及它们所必须的运行环境,包括文件系统、系统类库、shell环境等。

Linux容器不是摸你一个完整的操作系统,而是对进程进行隔离,有了容器,就可以将软件运行所需要的所有资源打包到一个隔离的容器中,容器与虚拟机不通,不需要绑定一整套操作系统,只需要软件工作所需的库资源和设置,系统因此变得高效轻量并保证部署在任何环境中的软件都始终如一的运行。

查看容器
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

查看失效的容器
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
7ffc3822ccb5        centos              "echo 运维Giao"       4 minutes ago       Exited (0) 4 minutes ago                       zen_pasteur

容器在运行的时候,容易出现执行完任务退出,我们必须要保证容器长时间运行才可以。

镜像生成容器——容器长时间运行
[root@localhost ~]# docker run -it centos /bin/bash
[root@c20fb4232801 /]#   #这时候表示在容器里
-t:打开一个终端
-i:容器与镜像进行交互
-it:表示打开一个新的shell

在容器里安装finger
[root@c20fb4232801 /]# yum install -y finger
查看用户信息
[root@c20fb4232801 /]# finger root
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Never logged in.
No mail.
No Plan.

退出,finger在物理机中不存在
[root@c20fb4232801 /]# exit
exit
[root@localhost ~]# finger
-bash: finger: command not found

容器的生命周期取决于容器指令的生命周期
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
c20fb4232801        centos              "/bin/bash"         3 minutes ago       Exited (0) 32 seconds ago                       awesome_kilby
7ffc3822ccb5        centos              "echo 运维Giao"       10 minutes ago      Exited (0) 10 minutes ago                       zen_pasteur

查看镜像IP地址
[root@localhost ~]# docker run centos ip a
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"ip\": executable file not found in $PATH": unknown.
[root@localhost ~]# docker run busybox ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
10: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
两者的区别是镜像不同,命令的执行成功取决于镜像是否存在此命令集
镜像分为两部分:centos操作系统类和应用软件类https、busybox

镜像生成容器——让容器一直运行,而不会退出
[root@localhost ~]# docker run -itd centos pwd
9368af992f10e8d70accaaac7b03f495043695873c7a1e2a35ca85df562684a2

-d:表示在后台运行

[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
发现并没有在后台运行,是因为命令pwd。
/bin/bash 会一直运行,只有输入exit才会退出,它是一个shell程序

镜像生成容器
[root@localhost ~]# docker run -itd centos /bin/bash
f5b65a6430abad9996daa398c9e051e92a8f5d4e3b0013a8d659934e8c61afc4 

容器会生成一个ID编号(12位)
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f5b65a6430ab        centos              "/bin/bash"         22 seconds ago      Up 21 seconds                           elated_kepler

进入容器
[root@localhost ~]# docker attach f5b65a6430ab
[root@f5b65a6430ab /]# 
provides:容器里没有某条命令,若想使用,provides查看这条命令应下载哪些软件包才可以使用。
[root@f5b65a6430ab /]# yum provides ip
一、Docker基础入门这篇文章够用了
[root@f5b65a6430ab /]# yum install -y iproute
ip a这条命令可以使用
[root@f5b65a6430ab /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

退出,容器终止
[root@f5b65a6430ab /]# exit
exit
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

重新运行一个容器,此时没有ip a,因为每次运行都是一个新的容器
[root@localhost ~]# docker run -itd centos /bin/bash
663d54847e4d022444c5ecbde9b83bc4eb29738d8ccdf9b8b9582d9233c40df5
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
663d54847e4d        centos              "/bin/bash"         2 seconds ago       Up 1 second                             sleepy_knuth
[root@localhost ~]# docker attach 663d54847e4d
[root@663d54847e4d /]# ip a
bash: ip: command not found
[root@663d54847e4d /]# exit 
exit
(4)进入容器attach与exec有何区别
一、Docker基础入门这篇文章够用了
[root@localhost ~]# docker start f5b65a6430ab
f5b65a6430ab
[root@localhost ~]# docker attach f5b65a6430ab
[root@f5b65a6430ab /]# 
[root@f5b65a6430ab /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@f5b65a6430ab /]# exit
exit
attch进入容器再退出后容器不运行,再次进入需要启动容器

[root@localhost ~]# docker start f5b65a6430ab
f5b65a6430ab
[root@localhost ~]# docker exec -it f5b65a6430ab /bin/bash
[root@f5b65a6430ab /]# 
[root@f5b65a6430ab /]# exit
exit

exit进入容器再退出容器还会继续运行
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f5b65a6430ab        centos              "/bin/bash"         14 minutes ago      Up 41 seconds                           elated_kepler

两者区别:一台电脑可以打开多个shell,且shell是多种的,一个电脑能够操控一台主机,是因为打开了一个shell。看下面操作理解一下。
[root@localhost ~]# ps -a
   PID TTY          TIME CMD
 15604 pts/0    00:00:00 ps
[root@localhost ~]# bash
[root@localhost ~]# bash
[root@localhost ~]# ps -a
   PID TTY          TIME CMD
 15605 pts/0    00:00:00 bash
 15616 pts/0    00:00:00 bash
 15627 pts/0    00:00:00 ps
[root@localhost ~]# exit
exit
[root@localhost ~]# exit
exit
[root@localhost ~]# ps -a
   PID TTY          TIME CMD
 15628 pts/0    00:00:00 ps

如果上面一顿操作还是不能理解什么多个shell的意思,下面请看图。
一、Docker基础入门这篇文章够用了
(5)使用脚本运行容器——容器退出仍能运行
[root@localhost ~]# vim /usr/bin/docker-enter 
#!/bin/sh
if [ -e $(dirname "$0")/nsenter ]; then
  # with boot2docker, nsenter is not in the PATH but it is in the same folder
  NSENTER=$(dirname "$0")/nsenter
else
  NSENTER=nsenter
fi
if [ -z "$1" ]; then
  echo "Usage: `basename "$0"` CONTAINER [COMMAND [ARG]...]"
  echo ""
  echo "Enters the Docker CONTAINER and executes the specified COMMAND."
  echo "If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
  PID=$(docker inspect --format "{{.State.Pid}}" "$1")
  if [ -z "$PID" ]; then
    exit 1
  fi
  shift
  OPTS="--target $PID --mount --uts --ipc --net --pid --"
  if [ -z "$1" ]; then
    # No command given.
    # Use su to clear all host environment variables except for TERM,
    # initialize the environment variables HOME, SHELL, USER, LOGNAME, PATH,
    # and start a login shell.
    "$NSENTER" $OPTS su - root
  else
    # Use env to clear all host environment variables.
    "$NSENTER" $OPTS env --ignore-environment -- "$@"
  fi
fi
[root@localhost ~]# chmod +x /usr/bin/docker-enter 
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f5b65a6430ab        centos              "/bin/bash"         19 minutes ago      Up 6 minutes                            elated_kepler
[root@localhost ~]# docker-enter f5b65a6430ab
[root@f5b65a6430ab ~]# exit
logout
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f5b65a6430ab        centos              "/bin/bash"         20 minutes ago      Up 7 minutes                            elated_kepler

(6)容器常用命令
运行容器
[root@localhost ~]# docker run -itd --name webserver centos /bin/bash
5f95c5fe6743480d84d723c454aeff830f507786d58434fbadcee9e555d7709c
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5f95c5fe6743        centos              "/bin/bash"         2 seconds ago       Up 1 second                             webserver
f5b65a6430ab        centos              "/bin/bash"         31 minutes ago      Up 4 minutes                            elated_kepler

进入容器
[root@localhost ~]# docker-enter webserver
[root@5f95c5fe6743 ~]# 
[root@5f95c5fe6743 ~]# exit
logout

容器停止
[root@localhost ~]# docker stop webserver
webserver

容器开启
[root@localhost ~]# docker start webserver
webserver

容器结束
[root@localhost ~]# docker kill webserver
webserver

容器挂起
[root@localhost ~]# docker pause webserver
webserver
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                   PORTS               NAMES
5f95c5fe6743        centos              "/bin/bash"         About a minute ago   Up 24 seconds (Paused) #注意这里                      webserver
f5b65a6430ab        centos              "/bin/bash"         33 minutes ago       Up 6 minutes                                 elated_kepler

容器结束挂起
[root@localhost ~]# docker unpause webserver
webserver
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5f95c5fe6743        centos              "/bin/bash"         2 minutes ago       Up 45 seconds  #刚才这里的Paused没有了                         webserver
f5b65a6430ab        centos              "/bin/bash"         33 minutes ago      Up 6 minutes                            elated_kepler

容器删除
[root@localhost ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5f95c5fe6743        centos              "/bin/bash"         3 minutes ago       Up About a minute                       webserver
f5b65a6430ab        centos              "/bin/bash"         34 minutes ago      Up 7 minutes                            elated_kepler
[root@localhost ~]# docker rm f5b65a6430ab
Error response from daemon: You cannot remove a running container f5b65a6430abad9996daa398c9e051e92a8f5d4e3b0013a8d659934e8c61afc4. Stop the container before attempting removal or force remove
正在运行的容器不能删除(采用强制删除)
[root@localhost ~]# docker rm f5b65a6430ab -f 
f5b65a6430ab

Docker本篇文章——总结


  • 下载镜像——docker pull
  • 上传镜像——docker push
  • 搜索镜像——docker search
  • 查看镜像——docker images(第一行是镜像命令,第二行是版本号,第三行是ID号,第四行是什么时间下载的,第五是镜像大小)
  • 镜像保存到本地——docker save -o 镜像.tar 镜像
  • 删除镜像——docker rmi(后面加镜像命令或者ID号)
  • 读取本地镜像——docker load
  • 查看系统具体信息——docker info
  • 查看容器详细信息——docker inspect
  • 镜像改名——docker tag 旧名称 新名称
  • 运行容器——docker run -itd --name 容器名 镜像名 命令
    -i:交互时登录 -t:tty伪终端 -d:后台运行
    运行分为两种:运行一次就关闭的和长久运行的,即docker的生命周期取决于启动参数运行的时间
    因为容器内很多动都没装,可以用yum provides 软件包 -y 查询
  • docker run 在后台的标准操作有:
    检查本地是否存在指定的镜像,不存在就从公有仓库下载
    利用镜像创建并启动一个容器
    分配一个文件系统,并在只读的镜像层外挂载一层可读写层
    从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
    从地址池配置一个IP地址给容器
    执行用户指定的应用程序
    执行完毕后容器被终止
    启动已终止的容器
  • 查看正在运行的容器——docker ps
  • 查看所有容器包括已退出的——docker ps -a
  • 删除容器——docker rm
  • 进入后台运行的容器——docker attach 和docker exec -it
    attach退出后就自动退出,exec退出后还在运行中。本质区别是attach直接访问这个容器,不会启动新的进程;exec是在这容器打开一个新的终端,可以启动新的进程。
    docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会同步的显示,假如其中的一个窗口发生阻塞时,其他的窗口也会阻塞。
    使用ctrl+p和ctrl+q,attach可以不退出
    使用docker-enter脚本
  • 制作镜像——docker commit
  • 启动已退出的容器——docker start
  • 关闭容器——docker stop
  • 重启容器——docker restart
  • 暂停容器——docker pause
  • 取消暂停的容器——docker unpause
  • kill指定容器——docker kill
  • 构建镜像——build:通过Dockerfile定制镜像
  • 从容器拷贝指定文件或目录到主机——docker cp src dest
  • 查看docker版本号——docker version
一、Docker基础入门这篇文章够用了

Registry 镜像站,下载镜像的位置

下载镜像到电脑images,命令:docker pull,

镜像备份到本地,docker save

镜像传到本地,docker load

镜像可以保存,上传,

在主机将镜像运行起来,可以对镜像进行一系列操作,

把真正想要的环境安装到电脑,

新的容器做一个新的镜像,供其他人可用;或者自己做一个镜像(dockerfile)

新的镜像修改名称,

最后将新的镜像push给其他人用。

Docker的基本组成:镜像image 容器container 仓库register
Docker registry是存放docker镜像的仓库,首先docker host从docker registry中pull一个镜像,名称为images,我们可以对这个镜像进行一系列的操作,比如save(把镜像保存到本地),也可以把本地的镜像load解压到docker里面(load)。我们可以运行镜像成容器(run),名称为(container),我们可以对容器进行开启、关闭、重启等,也可以进入容器对其修改(exec),在里面可以部署服务比如nginx,这时候我们也可以让修改过的容器生成新的镜像(commit)。我们也可以对镜像进行修改名称(tag)。Dockerfile也可以生成镜像。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: