一、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 容器后台运行
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)- (uname−s)−(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 由于自定义了网络,容器之间可以直接通过服务名或者容器名进行通讯,由于最佳实战就是一个容器对应一个服务,所以是上面的例子服务名称和容器名称是一样的
前提条件,保证 /var/ 所在的分区空闲容量大于 40 G, 因为默认情况下, /var/lib/docker/ 目录存放了 Docker 的镜像,容器,卷,网络等文件。 当使用的镜像越来越多的情况下,这个目录的容量也会变的很大。
安装最新版本的Docker CE
yum install -y docker-ce docker-ce-cli containerd.io 1这时,Docker 会主动去下载这个镜像,并用这个镜像启动一个容器;当容器运行时,它打印 Hello from 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注册阿里云账户并登录
之后点击控制台
再点击容器镜像服务
点击镜像加速
点击 Centos 后按照提示完成配置
语法:
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查看所以的容器
[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此容器的名称容器 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源和目标可以是本地文件的路径,也可以是容器内的文件路径
将本地的文件 a.txt 拷贝到容器的 /root/ 目录下
docker cp a.txt bcbf:/root/ 1映射目录是一样的操作
示例:
[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之后再访问使用容器,就可以把 容器 ID更换成 容器名称了
[xiguatian@VM-0-11-centos ~]$ docker exec -it h1 bash [root@9329acd400e3 /]# 123先查看
[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定义 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 指定了构建后的镜像名称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 文件
先安装 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注意:默认情况下,所有的 docker-compose 命令都必须在含有 docker-compose.yml 文件的目录下执行。 换句话说,执行 docker-compose 命令的时候,需要保证当前目录下有 docker-compose.yml 文件。
docker-compose up -d 1执行容器内的 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在不移除容器的情况下停止运行容器。 之后,可以使用“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 123456789101112131415down 子命令,用于处于 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先定义一个 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 中,安装的基本的软件,和 sshd、crond 服务。 会支持 ssh 远程连接、计划任务、ip 命令 ,ss 命令, 还有开发工具。
下面是添加后的完整 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每次修改完 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更新 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入门 一:容器介绍
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/ 四:深入理解容器
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输出到文件中,方便后续脚本操作。
镜像名称 镜像是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命令中,以执行特定版本的镜像。
名字空间 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.删除容器