Docker#Docker的基本使用

cherrytree版本

一、docker的安装和卸载
  默认/var/lib/docker/目录下面存放Docker的镜像、容器、卷、网络文件,保证/var/所在容量大于40G
  Docker容器其实就是一个进程

1、下载Docker仓库
wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2、安装Docker引擎,docker-ce
yum install -y docker-ce docker-ce-cli containerd.io

3、启动和开机自启Docker
systemctl start docker && systemctl enable docker

4、通过运行Docker最小镜像hello-world来验证Docker是否安装成功
docker run hello-world
  本地没有镜像就会从官方镜像仓库Docker Hub拉取,这个镜像没有什么实际意义,只是用来检测Docker服务环境是否正常,正常的话会在拉取玩镜像后打印出,Hello from Docker! 证明Docker Engine安装成功

5、卸载Docker
卸载Docker Engine,CLI和Containerd软件包
yum remove docker-ce docker-ce-cli containerd.io
删除所有的镜像、容器和卷
rm -rf /var/lib/docker

6、使用非 root 用户管理 docker
  Docker守护进程绑定到Unix套接字而不是TCP端口。默认情况下,Unix套接字是归 root 用户所有,其他用户只能使用 sudo 的方式访问它。
  Docker守护进程始终以 root 用户身份运行。如果您不想在 docker 命令前面加 sudo,请创建一个名为 docker 的组(centos 中 这个组已经存在)并向其中添加用户。
  当Docker守护进程启动时,它会创建一个Unix套接字,供Docker组的成员访问

二、更换阿里容器镜像仓库,加快镜像下载速度
  https://www.aliyun.com/~登录~搜索容器镜像服务~镜像加速器~按照文档配置/etc/docker/daemon.json,每个用户都会有自己专有的链接

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://vd3mapah.mirror.aliyuncs.com”]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

三、Docker的基本使用(注意区别对容器的操作和对镜像的操作)

1、Docker命令语法
docker   run  -itd centos:7
    子命令 选项 镜像名称:标签
  假如运行的镜像不在本地,会自动从 Docker hub 下载到本地,之后再运行,不加标签默认标签tag为最新latest
• -i 表示持续和容器交互,防止断开
• -t 分配一个伪tty终端,以便和容器进行命令的交互
• -d 容器后台运行

扫描二维码关注公众号,回复: 12011971 查看本文章

2、运行Centos7镜像
docker run -it centos:7
  run子命令后面跟的是镜像名,run命令相当于用镜像创建一个容器,-d参数可以让run创建的容器为后台运行状态(up),不加-d参数,会直接进入run创建的容器,exit退出后,容器状态为停止状态(exited)
  run通过镜像创建容器的时候最好给容器起一个辨识度高、好记、有意义的名字,如果不起名,系统随机起名
docker run -itd --name 容器名称 centos:7

3、查看本地镜像
docker images 或者 docker image ls

4、搜索镜像
docker search redis --limit 2
支持模糊匹配,一般第一个就是官方的,Docker官方或者相关应用官方
–limit 2 只显示前两个

5、拉取镜像到本地
pull默认拉取search的第一个
docker pull 仓库名[:标签]
docker pull centos:8
Pulling from library/centos 仓库名采用两段式<用户名>/<镜像名>,默认用户名是library即官方镜像
镜像是分层的,一层一层的拉取

6、删除本地镜像
docker image rm hello-world(新命令)
docker rmi hello-world(旧命令)
docker rmi 仓库名(镜像名):标签/唯一标识的镜像ID

7、查看所有容器
docker ps -a

8、查看运行状态的容器
docker ps

9、启动/重启一个已经停止的容器
docker start 容器ID/容器名称
docker restart 容器ID/容器名称
  容器ID不必写全,只要保证可以识别到唯一的容器即可,但容器ID并不方便,所以最好给每一个run创建的容器起一个辨识度高的name名字

10、停止一个正在运行的容器
docker stop 容器ID/容器名称

11、进入和退出一个正在运行的容器(如果容器停止,需要先启动)
docker attach 容器ID/容器名称
attach方式进入容器,exit退出后会导致容器的状态为退出终止(和run一样),因为当使用docker attach命令进入容器时,执行的是容器自带的命令,把容器默认进程杀掉,容器自然终止
docker exec -it 容器ID/容器名称 bash(容器内的命令)
  进入一个正在运行的容器需要执行一个容器内的命令
docker exec进入容器,exit退出后对容器的状态不会产生影响
退出容器:exit

12、删除一个已经停止的容器
docker rm 容器ID/容器名称
删除已经停止的全部容器(或者删除其他状态的容器)
首先 -f 参数过滤出是退出状态的容器,注意小写(-f 相当于管道命令)
docker ps -a -f status=exited
然后 -q 参数只显示容器id
docker ps -aq -f status=exited
最后$()或者``预先执行后删除
docker rm docker ps -aq -f status=exited
docker rm $(docker ps -aq -f status=created)

13、镜像的保存和加载
有时由于环境原因有些机器无法拉取镜像,可以使用Docker的保存和加载机制,把镜像复制到任意服务器
docker images
docker save centos:8 > centos-8.tar
ls可以在当前目录看到centos-8.tar,扩展名重要名字随意,将其拷贝到目标服务器
docker load < centos-8.tar
docker images

14、容器的导出和导入
docker ps -a
docker run -itd --name ubuntu ubuntu:latest
docker export ubuntu > ubuntu.tar
ls可以咋在当前目录看到ubuntu.tar,扩展名重要名字随意,将其拷贝到目标服务器
docker import ubuntu.tar
注意,import命令是将容器快照导入为的镜像
docker images
docker tag a52ae06e1441 centos:7
tag加的镜像ID,给新import的镜像加上仓库名和标签,重复操作不会覆盖,会新建
(docker tag centos:7 sun:8)

15、本地文件和容器文件快速交换(cp拷贝和scp格式一样)
将本地的文件 a.txt 拷贝到容器的 /root/ 目录下,反之亦然
docker cp a.txt 容器ID/容器名称:/mnt/

16、挂载本地文件/目录到容器
要求root操作,可以实现配置文件的双向同步更改
docker run -it -v /home/a.txt:/tmp/a.txt centos:7
• -v 本地文件路径,这个路径必须是绝对路径
只能run的时候挂挂载
docker run -itd --name sunlizhen -v /mnt/sun.txt:/tmp/a.txt ubuntu:latest

17、后台运行映射容器端口到本地端口
docker run -d   -p   8000:80    nginx
   运行在后台 映射端口 本地端口:容器端口 镜像名称
不执行命令也就没有必要 -t 分配一个伪终端
不进入容器也就没有必要 -i 持续交互
都写也可以
docker run -itd -p 8000:80 nginx
访问本地的8000端口,可以看到nginx服务 -I 只看响应头
curl -I 127.0.0.1:8000

四、Dockerfile制作镜像
  镜像里面通常只有一些基本命令,但有时候部署应用需求要在容器里面预装一些软件,和进行一些初始化配置,可以编辑一个Dockerfile文件来实现(默认文件名不能变,就是Dockerfile,当然也可以加参数指定)
mkdir centos7
cd centos7/
vim Dockerfile
FROM centos:7       #创建的镜像以哪一个镜像为基础,本地有这个基础镜像就直接用,没有会先拉取
RUN yum install -y \     #以centos:7镜像为基础创建一个容器,之后执行容器里面的命令
vim bash-com* openssh-clients openssh-server iproute cronie;
yum group install -y “Development Tools”;yum clean all;
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8  #设置环境变量,让容器支持中文
#只安装需要的软件和进行必须要的设置,容器瘦身
bash-com*(自动命令补全) openssh-clients(保证有ssh命令) openssh-server(保证有sshd服务) iproute(保证有ip a和ss命令) cronie(计划任务服务)
Development Tools安装一组编译安装需要的开发环境
yum clean all缓存清除,保证容器最小
FROM、RUN、ENV叫做Dockerfile的指令,每执行一个Dockerfile指令,镜像增加一层(指令尽量少)

编写完Dockerfile文件后build构建镜像仓库
docker build . -t centos7-sshd
. 表示在当前目录去寻找Dockerfile文件 -t 指定了构建后的镜像名称
Successfully built d83a8a429831
Successfully tagged centos7-sshd:latest
docker run -itd --name h5 --rm centos7-sshd
–rm 的作用是容器退出后自动删除

五、Dockerfile创建的镜像当做虚拟机使用
docker exec -it h5 bash方式进入虚拟机,没有权限不能执行systemctl命令,因为容器仅仅只是真正宿主机的一个进程而已,没有权限,需要特权模式run一个容器
docker run -itd --name h9 --rm --privileged=true centos7-sshd /usr/sbin/init
–privileged=true 特权模式
/usr/sbin/init 执行systemctld1号进程的命令

六、docker-compose
compose英 [kəmˈpəʊz] 美 [kəmˈpoʊz]
v.组成,构成(一个整体);作曲;创作(音乐);撰写
  Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流。使用Compose基本上是一个三步过程:
  1、使用定义应用环境,Dockerfile以便可以在任何地方复制。
  2、定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行
  3、Run docker-compose upand Compose启动并运行您的整个应用程序。
  Compose 使用一个具有 YAML风格的文件来实现,这个文件一般叫做 docker-compose.yml 。通过编写这个文件来定义一组相互之间有关联的应用容器。
概念
  Compose 中有两个比较重要的概念: 服务service 和 项目 project。
  服务 service
  就是一个应用容器,实际上可以包含多个使用相同镜像运行的容器实例。
  项目 project
  就是包含了多个 service 的一个 docker-compose.yml 文件

七、docker-compose的安装
mac和windows安装docker会自动安装docker-compose,linux特殊

1、 下载docker-compose
curl -L “https://github.com/docker/compose/releases/download/1.27.4/docker-compose- ( u n a m e − s ) − (uname -s)- (unames)(uname -m)” -o /usr/local/bin/docker-compose

2、/usr/local/bin/docker-compose增加可执行权限
chmod +x /usr/local/bin/docker-compose

3、验证安装
docker-compose version

4、安装docker-compose子命令自动补全
先安装bash自身的子命令补全软件包
yum install bash-completion
再安装docker-compose子命令自动补全
curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
测试是否下载成功,echo $?
重新登录,重启
docker-compose p # 连续敲两次 Tab 键
pause port ps pull push

八、docker-compose的使用

1、首先在指定的目录中编辑一个docker-compose.yml文件

docker-compose版本不同会支持不同属性的名字,有的属性必须高版本才有,所以要声明版本。服务名称和容器名称可以不一样。单引,双引无所谓。指令command属性默认就是bash。network,可以给容器定义一个自定义的网络,好处是设置自定义网络后可以直接使用容器名或者服务名进行通讯,不用考虑ip。配置了自定义网络IPv4地址可以不配置。静态ip,子网网络,网关前三位要对应。

2、以后台的方式运行:up -d
  注意:默认情况下,所有的 docker-compose 命令都必须在含有 docker-compose.yml 文件的目录下执行。
  换句话说,执行 docker-compose 命令的时候,需要保证当前目录下有 docker-compose.yml 文件。
docker-compose up -d  //不加-d后台运行,程序阻塞

3、列出当前 docker-compose 管理的所有的容器: ps
docker-compose ps

4、列出当前 docker-compose 管理的所有的服务: ps --services
docker-compose ps --services
host1

5、执行容器内的命令:exec
docker-compose exec 服务名 命令 [选项]
执行查看ip命令:docker-compose exec host1 hostname -i
172.16.1.10
执行进入容器命令bash:docker-compose exec host1 bash
在容器中执行exit可以退出容器

6、停止/启动容器: stop/start
在不移除容器的情况下停止运行容器:
docker-compose stop 容器名称
docker-compose stop host1
使用“docker compose start 容器名称”重新启动它们
docker-compose start host1

7、移除/删除/销毁容器:down
  down子命令,停止容器并且删除,并删除容器、网络、卷和映像。
默认情况下删除如下内容:
compose 文件中为服务定义的容器
compose 文件中顶级的 networks 定义的网络设备
默认网络,如果使用了
放心,它不会删除 external 使用的外部网络和卷
选项 -v 可以一同删除 compose 文件中定义的卷,默认是不删除的。
docker-compose down
docker-compose down -v

九、docker-compose的容器编排技术

1、含有多台主机的 docker-compose.yml
定义一个 Dockerfile
  先定义一个 Dockerfile,我们可以从这个 Dockerfile 中构建一个自定义的镜像,从而获取到一个我们自定义的容器。
FROM centos:7
RUN yum install -y
vim bash-com* openssh-clients openssh-server iproute cronie;
yum group install -y “Development Tools”;yum clean all;
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 &&
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8

定义 docker-compose 文件
version: ‘3.8’
services:
h1:
build: .
image: centos7-sshd
container_name: h1
privileged: true
command: /usr/sbin/init
hostname: h1.sharkyun.com
networks:
xiuyun_net:
ipv4_address: 172.16.2.10

h2:
build: .
image: centos7-sshd
container_name: h2
privileged: true
hostname: h2.sharkyun.com
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.20
h3:
build: .
image: centos7-sshd
container_name: h3
hostname: h3.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.30
networks:
xiuyun_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.2.0/24
gateway: 172.16.2.1

2、构建并启动 docker-compose.yml 中的容器
docker-compose up -d

3、添加一个新的容器进入已有的 compose 项目中
  编辑 compose 文件,并添加新的容器的声明,新的声明放在顶级网络的上面
h4:
build: .
image: centos7-sshd
container_name: h4
hostname: h4.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.40

4、更新 compose 项目
  每次修改完 docker-compose.yml 文件的内容后,只需要重新执行
docker-compose up -d 命令即可立即生效
假如想再加入一个 nginx
version: ‘3.8’
services:
h1:
build: .
image: centos7-sshd
container_name: h1
privileged: true
command: /usr/sbin/init
hostname: h1.sharkyun.com
networks:
xiuyun_net:
ipv4_address: 172.16.2.10

h2:
build: .
image: centos7-sshd
container_name: h2
privileged: true
hostname: h2.sharkyun.com
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.20
h3:
build: .
image: centos7-sshd
container_name: h3
hostname: h3.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.30
h4:
build: .
image: centos7-sshd
container_name: h4
hostname: h4.sharkyun.com
privileged: true
command: /usr/sbin/init
networks:
xiuyun_net:
ipv4_address: 172.16.2.40
web1:
image: nginx
container_name: web1
hostname: web1
networks:
xiuyun_net:
ipv4_address: 172.16.2.80

networks:
xiuyun_net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.2.0/24
gateway: 172.16.2.1

5、使用其中的一个容器访问 nginx 服务
docker-compose exec h1 curl -I web1
  由于自定义了网络,容器之间可以直接通过服务名或者容器名进行通讯,由于最佳实战就是一个容器对应一个服务,所以是上面的例子服务名称和容器名称是一样的

markdown版本

把 Docker 容器当做虚拟机使用

一、安装和卸载 Docker

前提条件,保证 /var/ 所在的分区空闲容量大于 40 G, 因为默认情况下, /var/lib/docker/ 目录存放了 Docker 的镜像,容器,卷,网络等文件。
当使用的镜像越来越多的情况下,这个目录的容量也会变的很大。

1 下载 Docker 仓库

wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
1

2 安装 Docker 引擎

安装最新版本的Docker CE

yum install -y docker-ce docker-ce-cli containerd.io
1

3 启动Docker

systemctl start docker && systemctl enable docker
1

4 通过运行hello-world 映像来验证是否正确安装了Docker Engine

[root@VM-0-11-centos ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Status: Downloaded newer image for hello-world:latest

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

这时,Docker 会主动去下载这个镜像,并用这个镜像启动一个容器;当容器运行时,它打印 Hello from Docker! 并退出。

5 卸载

5.1 卸载Docker Engine,CLI和Containerd软件包

yum remove docker-ce docker-ce-cli containerd.io
1

5.2 删除所有的镜像、容器和卷

rm -rf /var/lib/docker
1

6 使用非 root 用户管理 docker

Docker守护进程绑定到Unix套接字而不是TCP端口。
默认情况下,Unix套接字是归 root 用户所有,其他用户只能使用 sudo 的方式访问它。

Docker守护进程始终以 root 用户身份运行。

如果您不想在 docker 命令前面加 sudo,请创建一个名为 docker 的组(centos 中 这个组已经存在)并向其中添加用户。

当Docker守护进程启动时,它会创建一个Unix套接字,供Docker组的成员访问。

[root@qq ~]# useradd -G docker xiguatian    # 创建一个新用户,把他添加到 docker 组中
[root@qq ~]# id xiguatian
uid=1005(xiguatian) gid=1005(xiguatian)=1005(xiguatian),990(docker)

[root@qq ~]# su - xiguatian         # 切换到普通用户

[xiguatian@qq ~]$ docker image ls   # 执行 Docker 命令
12345678

二、启动一个centos7容器

1 使用阿里云的镜像源,加速镜像下载速度

注册阿里云账户并登录

之后点击控制台
在这里插入图片描述

再点击容器镜像服务

在这里插入图片描述

点击镜像加速

在这里插入图片描述

点击 Centos 后按照提示完成配置

在这里插入图片描述

2 运行 Centos7容器

语法:

docker  run    -it       centos:7 
      子命令     选项     镜像名称:标签
12

假如运行的镜像不在本地,会自动从 Docker hub 下载到本地,之后再运行。

[xiguatian@VM-0-11-centos ~]$ docker run -it centos:7
Unable to find image 'centos:7' locally
7: Pulling from library/centos
75f829a71a1c: Pull complete
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:7
[root@bcbf2db9ae6a /]# cd
[root@bcbf2db9ae6a ~]# ls
anaconda-ks.cfg
[root@bcbf2db9ae6a ~]# exit  # 退出容器
exit
1234567891011
  • -t 分配一个伪TTY,以便和容器进行命令的交互
  • -i 表示持续和 容器交互,防止断开

三、查看本地镜像

使用命令 docker images 或者 docker image ls

[xiguatian@VM-0-11-centos ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   7e6257c9f8d8        6 weeks ago         203MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB

12345

或者

[xiguatian@VM-0-11-centos ~]$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   7e6257c9f8d8        6 weeks ago         203MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
[xiguatian@VM-0-11-centos ~]$
12345

四、容器进阶操作

1 查看容器

查看所以的容器

[xiguatian@VM-0-11-centos ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
bcbf2db9ae6a        centos:7            "/bin/bash"         9 minutes ago       Exited (0) 8 minutes ago                        hardcore_dewdney
e57b04317fad        hello-world         "/hello"            18 minutes ago      Exited (0) 18 minutes ago                       inspiring_sanderson
[xiguatian@VM-0-11-centos ~]$
12345

各列的含义

字段名 含义
CONTAINER ID 容器 ID, 具有唯一性
IMAGE 镜像名称, 就是说这个容器是用这个镜像创建的
COMMAND 运行这个容器时,在容器内执行的命令,一般都有一些默认的命令
CREATED 此容器何时创建的
STATUS 此容器的状态
PORTS 宿主机和容器之间的端口映射
NAMES 此容器的名称

2 启动一个已经停止的容器

docker start bcbf2db9ae6a
             容器 ID
12

在这里插入图片描述

2 进入/退出容器

docker exec -it  bcbf2       bash
                容器 ID    容器内的命令
12

容器 ID 不必写全,只要保证可以识别到唯一的容器即可

[xiguatian@VM-0-11-centos ~]$ docker exec -it bcbf2 bash
[root@bcbf2db9ae6a /]# cd
[root@bcbf2db9ae6a ~]# ls
anaconda-ks.cfg
[root@bcbf2db9ae6a ~]# exit
exit
[xiguatian@VM-0-11-centos ~]$
12345678

3 停止/重启容器

docker   stop  bcbf
               容器 ID

1234

在这里插入图片描述

4 本地文件和容器文件快速交换

docker cp   源   目标
1

源和目标可以是本地文件的路径,也可以是容器内的文件路径

将本地的文件 a.txt 拷贝到容器的 /root/ 目录下

docker  cp   a.txt  bcbf:/root/
1

在这里插入图片描述

5 挂载本地文件/目录到容器

[xiguatian@VM-0-11-centos ~]$ docker run  -it -v /home/xiguatian/a.txt:/tmp/a.txt centos:7
[root@9b3b9968b639 /]# cat /tmp/a.txt
hello shark
[root@9b3b9968b639 /]#

12345
  • -v 本地文件路径,这个路径必须是绝对路径

映射目录是一样的操作

6 后台运行和映射容器端口到本地端口

docker run  -d        -p      8000:80          nginx
       运行在后台    映射端口  本地端口:容器端口    镜像名称
12

示例:

[xiguatian@VM-0-11-centos ~]$ docker run -d -p 8000:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
d121f8d1c412: Pull complete
ebd81fc8c071: Pull complete
655316c160af: Pull complete
d15953c0e0f8: Pull complete
2ee525c5c3cc: Pull complete
Digest: sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Status: Downloaded newer image for nginx:latest
4e13ff50aca75db6a7e554ecb609091b2da65df5ac7cc1bb64e21928d727a1c0
1234567891011

访问本地的 8000 端口

[xiguatian@VM-0-11-centos ~]$ curl -I 127.0.0.1:8000
HTTP/1.1 200 OK
Server: nginx/1.19.2
Date: Thu, 24 Sep 2020 13:05:27 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Aug 2020 14:50:35 GMT
Connection: keep-alive
ETag: "5f32b03b-264"
Accept-Ranges: bytes
12345678910

7 启动容器时候给容器一个名字

docker run -itd    --name h1    centos:7
                     容器名称    镜像名称
12

在这里插入图片描述
之后再访问使用容器,就可以把 容器 ID更换成 容器名称了

[xiguatian@VM-0-11-centos ~]$ docker exec -it h1 bash
[root@9329acd400e3 /]#

123

8 删除已经停止的容器

docker  rm  容器 ID/容器名称

12

在这里插入图片描述

五、镜像操作

1 搜索镜像

[xiguatian@VM-0-11-centos ~]$ docker search redis --limit 2
NAME                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis               Redis is an open source key-value store that…   8592                [OK]
bitnami/redis       Bitnami Redis Docker Image                      161                                     [OK]
[xiguatian@VM-0-11-centos ~]$
12345

2 下载镜像到本地

[xiguatian@VM-0-11-centos ~]$ docker pull redis
Using default tag: latest
latest: Pulling from library/redis
d121f8d1c412: Already exists
2f9874741855: Pull complete
d92da09ebfd4: Pull complete
bdfa64b72752: Pull complete
e748e6f663b9: Pull complete
eb1c8b66e2a1: Pull complete
Digest: sha256:1cfb205a988a9dae5f025c57b92e9643ec0e7ccff6e66bc639d8a5f95bba928c
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[xiguatian@VM-0-11-centos ~]$
12345678910111213

3 删除本地镜像

先查看

[xiguatian@VM-0-11-centos ~]$ docker image  ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              84c5f6e03bf0        13 days ago         104MB
nginx               latest              7e4d58f0e5f3        2 weeks ago         133MB
centos              7                   7e6257c9f8d8        6 weeks ago         203MB
hello-world         latest              bf756fb1ae65        8 months ago        13.3kB
123456

再删除

[xiguatian@VM-0-11-centos ~]$ docker image rm hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bc
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
Deleted: sha256:9c27e219663c25e0f28493790cc0b88bc973ba3b1686355f221c38a36978ac63

123456

4 Dockerfile 制作镜像

定义 Dockerfile

FROM centos:7
RUN yum install -y \
    vim bash-com* openssh-clients openssh-server iproute cronie;\
    yum group install -y "Development Tools";yum clean all;\
    localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8
1234567

构建Docker 镜像

[xiguatian@VM-0-11-centos ~]$ ls Dockerfile
Dockerfile

[xiguatian@VM-0-11-centos ~]$ docker build . -t centos7-sshd

12345
  • -t 指定了构建后的镜像名称

六、docker-compose

Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。要了解有关Compose的所有功能的更多信息,请参阅功能列表。

Compose可在所有环境中工作:生产,登台,开发,测试以及CI工作流。您可以在“ 通用用例”中了解有关每种用例的更多信息。

使用Compose基本上是一个三步过程:

使用定义您的应用环境,Dockerfile以便可以在任何地方复制。

定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。

Run docker-compose upand Compose启动并运行您的整个应用程序。

Compose 使用一个具有 YAML风格的文件来实现,这个文件一般叫做 docker-compose.yml 。

通过编写这个文件来定义一组相互之间有关联的应用容器。

概念
Compose 中有两个比较重要的概念: 服务service 和 项目 project。

服务 service
就是一个应用容器,实际上可以包含多个使用相同镜像运行的容器实例。

项目
就是包含了多个 service 的一个 docker-compose.yml 文件

1 安装 docker-compose

1.1 下载

 curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
1

1.2 修改为可执行权限

chmod +x /usr/local/bin/docker-compose
1

1.3 验证安装

[xiguatian@VM-0-11-centos ~]$ docker-compose version
docker-compose version 1.27.4, build 40524192
docker-py version: 4.3.1
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

123456

1.4 子命令补全

先安装 BASH 自身的子命令补全软件包

yum install bash-completion
1
curl -L https://raw.githubusercontent.com/docker/compose/1.27.4/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose

12

测试是否下载成功

echo $?
1

之后退出并重新登录即可

[xiguatian@qq ~]$ docker-compose p  # 连续敲两次 Tab 键
pause  port   ps     pull   push
[xiguatian@qq ~]$ docker-compose p
123

2 简单使用

2.1 首先在一个指定的目录中编辑一个 docker-compose.yml 文件,

version: "3.8"                     # 指定要使用 docker-compose 的版本
services:                          # 声明服务
  host1:                           # 第一个服务的名称,可以设置多个服务
    image: "centos:7"              # 从这个镜像启动一个容器
    container_name: "host1"        # 容器启动后的名称
    stdin_open: true               # 相当于 docker run 的 -i    
    tty: true                      # 相当于 docker run 的 -t
    #command: /bin/bash            # 一开始执行的命令 
    networks:                      # 设置这个服务的网络信息
      centos_net:                  # 网络名称,需要在下面顶级的 networks 中声明
        ipv4_address: 172.16.1.10  # 指定一个静态的 IP 地址

networks:                          # 顶级 networks ,设置整个 docker-compose 使用的网络设备
  centos_net:                      # 网络设备名称
    driver: bridge                 # 网络设备是网桥,可以理解为是一个交换机设备
    ipam:                          # 顶层网络部分中相应的网络配置必须具有ipam块
      driver: default              # 采用的默认的网络模式
      config:                      # 下面是一个配置列表
        - subnet: 172.16.1.0/24    # 子网网络
          gateway: 172.16.1.1      # 网关
1234567891011121314151617181920

2.2 以后台的方式运行: up -d

注意:默认情况下,所有的 docker-compose 命令都必须在含有 docker-compose.yml 文件的目录下执行。
换句话说,执行 docker-compose 命令的时候,需要保证当前目录下有 docker-compose.yml 文件。

docker-compose up -d
1

2.3 列出当前 docker-compose 管理的所有的容器: ps

docker-compose ps
[xiguatian@qq centos7]$ docker-compose ps
Name     Command    State   Ports
---------------------------------
host1   /bin/bash   Up
[xiguatian@qq centos7]$
12345

2.4 列出当前 docker-compose 管理的所有的服务: ps --services

docker-compose ps --services
[xiguatian@qq centos7]$ docker-compose ps --services
host1
[xiguatian@qq centos7]$
123

2.5 执行容器内的命令:exec

docker-compose exec 服务名 命令 [选项]
[xiguatian@qq centos7]$ docker-compose exec host1 hostname -i
172.16.1.10

123

执行容器内的 bash 命令,就会进入容器

[xiguatian@qq centos7]$ docker-compose exec host1 bash
[root@befd9a2727ed /]# cd
[root@befd9a2727ed ~]# hostname -i
172.16.1.10

12345

执行容器内的 exit 命令,就会退出容器

[root@befd9a2727ed ~]# exit
exit
[xiguatian@qq centos7]$

1234

2.6 停止/启动容器: stop

在不移除容器的情况下停止运行容器。
之后,可以使用“docker compose start”重新启动它们。

stop [options] [--] [SERVICE...]
[xiguatian@qq centos7]$ docker-compose stop host1
Stopping host1 ... done
[xiguatian@qq centos7]$
[xiguatian@qq centos7]$ docker-compose ps
Name     Command     State     Ports
------------------------------------
host1   /bin/bash   Exit 137
[xiguatian@qq centos7]$
[xiguatian@qq centos7]$ docker-compose start host1
Starting host1 ... done
[xiguatian@qq centos7]$
[xiguatian@qq centos7]$ docker-compose ps
Name     Command    State   Ports
---------------------------------
host1   /bin/bash   Up
123456789101112131415

3.4 移除/删除/销毁容器:down

down 子命令,用于处于 Up 状态的容器停止,并删除容器、网络、卷和映像。

默认情况下删除如下内容:

  • compose 文件中为服务定义的容器
  • compose 文件中顶级的 networks 定义的网络设备
  • 默认网络,如果使用了

放心,它不会删除 external 使用的外部网络和卷。

选项 -v 可以一同删除 compose 文件中定义的卷,默认是不删除的。

[xiguatian@qq centos7]$ docker-compose down
Stopping host1 ... done
Removing host1 ... done
Removing network centos7_centos_net
1234

七、 docker-compose的容器编排

1 含有多台主机的 docker-compose.yml

1.1 定义一个 Dockerfile

先定义一个 Dockerfile,我们可以从这个 Dockerfile 中构建一个自定义的镜像,从而获取到一个我们自定义的容器。

FROM centos:7
RUN yum install -y \
    vim bash-com* openssh-clients openssh-server iproute cronie;\
    yum group install -y "Development Tools";yum clean all;\
    localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ENV LANG=zh_CN.UTF-8
1234567

在上面的 Dockerfile 中,安装的基本的软件,和 sshdcrond 服务。
会支持 ssh 远程连接、计划任务、ip 命令 ,ss 命令, 还有开发工具。

1.2 定义 docker-compose 文件

version: '3.8'
services:
  h1:
    build: .
    image: centos7-sshd
    container_name: h1
    privileged: true
    command: /usr/sbin/init
    hostname: h1.sharkyun.com
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.10

  h2:
    build: .
    image: centos7-sshd
    container_name: h2
    privileged: true
    hostname: h2.sharkyun.com
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.20
  h3:
    build: .
    image: centos7-sshd
    container_name: h3
    hostname: h3.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.30
networks:
  xiuyun_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.2.0/24
          gateway: 172.16.2.1
1234567891011121314151617181920212223242526272829303132333435363738394041

2 构建并启动 docker-compose.yml 中的容器

docker-compose up -d

12

3 添加一个新的容器进入已有的 compose 项目中

3.1 编辑 compose 文件,并添加新的容器的声明

  h4:
    build: .
    image: centos7-sshd
    container_name: h4
    hostname: h4.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.40

1234567891011

下面是添加后的完整 docker-compose.yml 文件内容

version: '3.8'
services:
  h1:
    build: .
    image: centos7-sshd
    container_name: h1
    privileged: true
    command: /usr/sbin/init
    hostname: h1.sharkyun.com
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.10

  h2:
    build: .
    image: centos7-sshd
    container_name: h2
    privileged: true
    hostname: h2.sharkyun.com
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.20
  h3:
    build: .
    image: centos7-sshd
    container_name: h3
    hostname: h3.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.30
  h4:
    build: .
    image: centos7-sshd
    container_name: h4
    hostname: h4.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.40
networks:
  xiuyun_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.2.0/24
          gateway: 172.16.2.1
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

3.2 更新 compose 项目

每次修改完 docker-compose.yml 文件的内容后,只需要重新执行
docker-compose up -d 命令即可立即生效。

[xiguatian@qq centos7]$ docker-compose up -d
h3 is up-to-date
h2 is up-to-date
h1 is up-to-date
Creating h4 ... done
12345

3.3 假如想再加入一个 nginx

version: '3.8'
services:
  h1:
    build: .
    image: centos7-sshd
    container_name: h1
    privileged: true
    command: /usr/sbin/init
    hostname: h1.sharkyun.com
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.10

  h2:
    build: .
    image: centos7-sshd
    container_name: h2
    privileged: true
    hostname: h2.sharkyun.com
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.20
  h3:
    build: .
    image: centos7-sshd
    container_name: h3
    hostname: h3.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.30
  h4:
    build: .
    image: centos7-sshd
    container_name: h4
    hostname: h4.sharkyun.com
    privileged: true
    command: /usr/sbin/init
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.40
  web1:
    image: nginx
    container_name: web1
    hostname: web1
    networks:
      xiuyun_net:
        ipv4_address: 172.16.2.80

networks:
  xiuyun_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.2.0/24
          gateway: 172.16.2.1
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859

更新 compose 项目

[xiguatian@qq centos7]$ docker-compose up -d
h2 is up-to-date
h1 is up-to-date
h4 is up-to-date
h3 is up-to-date
Creating web1 ... done
[xiguatian@qq centos7]$
1234567

使用其中的一个容器访问 nginx 服务

[xiguatian@qq centos7]$ docker-compose exec h1 curl -I web1
HTTP/1.1 200 OK
Server: nginx/1.19.2
Date: Sat, 26 Sep 2020 06:40:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 11 Aug 2020 14:50:35 GMT
Connection: keep-alive
ETag: "5f32b03b-264"
Accept-Ranges: bytes

开启新篇章——Docker入门
一:容器介绍

  1. logo

容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集装箱一样,把你的应用"装"起来的技术。这样,应用与应用之间,就因为有了边界而不至于相互干扰;而被装进集装箱的应用,也可以被方便地搬来搬去,这其实是 PaaS 最理想的状态。
2. 云计算服务类型
基础设施即服务IaaS
平台即服务(PaaS)
软件即服务(SaaS)
3. 容器本质
容器的本质是进程,容器就是未来云计算系统中的进程。
4. 容器和虚拟机对比

容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,​​并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM,可以处理更多的应用程序,并且需要的VM和操作系统更少。
特性 虚拟机 容器
启动 分钟级 秒级
硬盘启动 一般为GB 一般为MB
性能 弱于 接近原生
系统支持量 一般几十个 单机支持上千个容器
5. docker基本概念
Docker系统有两个程序:docker服务端和docker客户端
Docker服务端:
是一个服务进程,管理着所有的容器。
Docker客户端:
是docker服务端的远程控制器,可以用来控制docker的服务端进程。
6. docker的优势
交付物标准化
Docker是软件工程领域的"标准化"交付组件,最恰到好处的类比是"集装箱"。
集装箱将零散、不易搬运的大量物品封装成一个整体,集装箱更重要的意义在于它提供了一种通用的封装货物的标准,卡车、火车、货轮、桥吊等运输或搬运工具采用此标准,隧道、桥梁等也采用此标准。以集装箱为中心的标准化设计大大提高了物流体系的运行效率。
传统的软件交付物包括:应用程序、依赖软件安装包、配置说明文档、安装文档、上线文档等非标准化组件。
Docker的标准化交付物称为"镜像",它包含了应用程序及其所依赖的运行环境,大大简化了应用交付的模式。
一次构建,多次交付
类似于集装箱的"一次装箱,多次运输",Docker镜像可以做到"一次构建,多次交付"。当涉及到应用程序多副本部署或者应用程序迁移时,更能体现Docker的价值。
应用隔离
集装箱可以有效做到货物之间的隔离,使化学物品和食品可以堆砌在一起运输。Docker可以隔离不同应用程序之间的相互影响,但是比虚拟机开销更小。
总之,容器技术部署速度快,开发、测试更敏捷;提高系统利用率,降低资源成本。
6.Docker三大核心组件
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
Docker仓库
用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。
公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
库:registry
公有库:
Docker-hub Daocloud ali 网易蜂巢
私有库:
公司内部使用(自己部署)
分类:
操作系统名称 centos ubuntu
应用名称 nginx tomcat mysql
Tag:
表示镜像版本
Docker 镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。下层那个镜像是上层镜像的父镜像。
镜像名称:
仓库名称+镜像分类+tag名称(镜像版本)
完整镜像名称:
docker.io/nginx:v1
docker.io/nginx:latest
daocloud.io/centos:6
镜像ID:
64位的id号
基础镜像:
一个没有任何父镜像的镜像,谓之基础镜像。
注意:

Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。Registry包含一个或多个Repository
Docker 容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
二:容器安装部署
使用aliyun docker yum源安装新版docker
删除已安装的Docker
(注意:这个是可选项,如果系统中存在那么我们就删除)
[root@xingdian ~]# yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-selinux
docker-engine-selinux
docker-engine
配置阿里云Docker Yum源
[root@xingdian ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 git
[root@xingdian ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装指定版本
查看Docker版本:
[root@xingdian ~]# yum list docker-ce --showduplicates
安装较旧版本(比如Docker 17.03.2) :
需要指定完整的rpm包的包名,并且加上–setopt=obsoletes=0 参数:
[root@xingdian ~]# yum install -y --setopt=obsoletes=0
docker-ce-17.03.2.ce-1.el7.centos.x86_64
docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
安装Docker新版本(比如Docker 19.03.0):
[root@xingdian ~]# yum install docker-ce-19.03.0.ce -y
或者
[root@xingdian ~]# yum install docker-ce -y
启动Docker服务
[root@xingdian ~]# systemctl enable docker
[root@xingdian ~]# systemctl start docker
查看docker版本状态
[root@xingdian ~]# docker -v
Docker version 19.03.12, build 48a66213fe
查看docker运行状态:
[root@xingdian ~]# docker info
Client:
Debug Mode: false
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 3
Server Version: 19.03.12
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1062.12.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.637GiB
Name: xingdian ID:DW7V:VN63:7P5F:X36D:UPXA:WSXK:NVXU:FG4E:UIKY:ISIZ:AVW3:3RXT
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
Live Restore Enabled: false
三:国内镜像仓库的使用
国内镜像站
https://www.daocloud.io
国外镜像站
https://hub.docker.com

镜像加速器
使用 Docker 的时候,需要经常从官方获取镜像,但是由于显而易见的网络原因,拉取镜像的过程非常耗时,严重影响使用 Docker 的体验。因此 DaoCloud 推出了加速器工具解决这个难题,通过智能路由和缓存机制,极大提升了国内网络访问 Docker Hub 的速度,目前已经拥有了广泛的用户群体,并得到了 Docker 官方的大力推荐。

配置 Docker 镜像站
Linux:
[root@xingdian ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
docker version >= 1.12
{“registry-mirrors”: [“http://f1361db2.m.daocloud.io”]}
Success.
You need to restart docker to take effect: sudo systemctl restart docker
[root@xingdian ~]# systemctl restart docker
登陆登出Docker Hub
login Register or log in to a Docker registry
登录到自己的Docker register,需有Docker Hub的注册账号
[root@xingdian ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one.
Username: 17343051369
Password:
Login Succeeded

logout Log out from a Docker registry
退出登录
# docker logout
Remove login credentials for https://index.docker.io/v1/
四:深入理解容器

  1. Docker的镜像和容器的区别
    Docker镜像
    假设Linux内核是第0层,那么无论怎么运行Docker,它都是运行于内核层之上的。这个Docker镜像,是一个只读的镜像,位于第1层,它不能被修改或不能保存状态。
    一个Docker镜像可以构建于另一个Docker镜像之上,这种层叠关系可以是多层的。第1层的镜像层我们称之为基础镜像(Base Image),其他层的镜像(除了最顶层)我们称之为父层镜像(Parent Image)。这些镜像继承了他们的父层镜像的所有属性和设置,并在Dockerfile中添加了自己的配置。
    要列出本地所有有效的镜像,可以使用命令

Docker容器
Docker容器可以使用命令创建:

它会在所有的镜像层之上增加一个可写层。这个可写层有运行在CPU上的进程,而且有两个不同的状态:运行态(Running)和退出态 (Exited)。这就是Docker容器。当我们使用docker run启动容器,Docker容器就进入运行态,当我们停止Docker容器时,它就进入退出态。当我们有一个正在运行的Docker容器时,从运行态到停止态,我们对它所做的一切变更都会永久地写到容器的文件系统中。要切记,对容器的变更是写入到容器的文件系统的,而不是写入到Docker镜像中的。我们可以用同一个镜像启动多个Docker容器,这些容器启动后都是活动的,彼此还是相互隔离的。我们对其中一个容器所做的变更只会局限于那个容器本身。如果对容器的底层镜像进行修改,那么当前正在运行的容器是不受影响的,不会发生自动更新现象。
64字符的十六进制的字符串来定义容器ID,它是容器的唯一标识符。容器之间的交互是依靠容器ID识别的,由于容器ID的字符太长,我们通常只需键入容器ID的前4个字符即可。当然,我们还可以使用容器名。
2. 容器名称
–name= Assign a name to the container    
–为容器分配一个名字,如果没有指定,会自动分配一个随机名称
–docker run子命令的参数
容器命名方式:
1)使用UUID长命名(“f78375b1c487e03c9438c729345e54db9d20cfa2ac1fc3494b6eb60872e74778”)
2)使用UUID短命令(“f78375b1c487”)
3)使用Name(“xingdian”)  
注意:
1.这个UUID标识是由Docker deamon生成的。
2.如果你在执行docker run时没有指定–name,那么deamon会自动生成一个随机字符串UUID。
3.但是对于一个容器来说有个name会非常方便,当你需要连接其它容器时或者类似需要区分其它容器时,使用容器名称可以简化操作。无论容器运行在前台或者后台,这个名字都是有效的。
4.如果在使用Docker时有自动化的需求,你可以将containerID输出到指定的文件中(PIDfile)类似于某些应用程序将自身ID输出到文件中,方便后续脚本操作。

  1. 镜像名称
    镜像是Docker最核心的技术之一,也是应用发布的标准格式。无论你是用docker pull image,或者是在Dockerfile里面写FROM image,下载镜像应该是Docker操作里面最频繁的动作之一了。
    下面是在本地机器运行docker images的输出结果:

常说的"ubuntu"镜像其实不是一个镜像名称,而是代表了一个名为ubuntu的Repository,同时在这个Repository下面有一系列打了tag的Image,Image的标记是一个GUID,为了方便也可以通过Repository:tag来引用。
那么Registry又是什么呢?Registry存储镜像数据,并且提供拉取和上传镜像的功能。
Registry中镜像是通过Repository来组织的,而每个Repository又包含了若干个Image。
• Registry包含一个或多个Repository
• Repository包含一个或多个Image
• Image用GUID表示,有一个或多个Tag与之关联
注意:
当一个镜像的名称不足以分辨这个镜像所代表的含义时,你可以通过tag将版本信息添加到run命令中,以执行特定版本的镜像。

  1. 名字空间
    namespace 空间隔离
    cgroup 资源限制
    rootfs 文件系统
    名字空间是 Linux 内核一个强大的特性。每个容器都有自己单独的名字空间,运行在其中的应用都像是在独立的操作系统中运行一样。名字空间保证了容器之间彼此互不影响。
    pid 名字空间
    不同用户的进程就是通过 pid 名字空间隔离开的,且不同名字空间中可以有相同 pid。
    net 名字空间
    有了pid名字空间, 每个名字空间中的 pid 能够相互隔离,但是网络端口还是共享 host 的端口。网络隔离是通过 net 名字空间实现的,每个 net 名字空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。
    mnt名字空间
    类似 chroot,将一个进程放到一个特定的目录执行。mnt 名字空间允许不同名字空间的进程看到的文件结构不同,这样每个名字空间 中的进程所看到的文件目录就被隔离开了。
    uts 名字空间
    UTS(“UNIX Time-sharing System”) 名字空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
    user 名字空间
    每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
    五:Docker使用
    镜像操作
    查看centos所有的镜像:

凡是镜像大于100的显示出来,小于100的不显示

拉取镜像:

查看本地镜像:

查看镜像详情:

删除镜像:
删除一个或多个,多个之间用空格隔开,可以使用镜像名称或id

删除所有镜像:

容器操作
1.启动容器并指定名为server并放后台运行

2.使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

3.使用镜像nginx:latest以交互模式启动容器,容器内执行/bin/bash命令。

4.查看容器
只查看运行状态的容器:

5.查看容器详细信息

6.启动容器

7.关闭容器

8.删除容器

猜你喜欢

转载自blog.csdn.net/kakaops_qing/article/details/108962119