docker介绍
Docker 是 Docker.Inc 公司开源的一个基于 LXC 技术之上构建的 Container 容器引擎, 源代码托管
在 GitHub 上, 基于 Go 语言并遵从 Apache2.0 协议开源。
Docker 是通过内核虚拟化技术(namespaces 及 cgroups 等)来提供容器的资源隔离与安全保障等。由
于 Docker 通过操作系统层的虚拟化实现隔离,所以 Docker 容器在运行时,不需要类似虚拟机(VM)
额外的操作系统开销,提高资源利用率。
namespaces命令空间
Mount Namespace - 用于隔离文件系统的挂载点
UTS Namespace - 用于隔离 HostName 和 DomianName
IPC Namespace - 用于隔离进程间通信
PID Namespace - 用于隔离进程 ID
Network Namespace - 用于隔离网络
User Namespace - 用于隔离用户和用户组 UID/GID
cgroups 资源限制
控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有
能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。
控制组技术最早是由 Google 的程序员在 2006 年提出,Linux 内核自 2.6.24 开始支持。
控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。
容器和虚拟的对比
image.pngdocker有3大核心:镜像、容器、仓库
Image(镜像):
那么镜像到底是什么呢?Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的
程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、
用户等)。
Container(容器)
容器(Container)的定义和镜像(Image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最
上面那一层是可读可写的。
Repository(仓库)
镜像仓库是 Docker 用来集中存放镜像文件的地方,类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将
以 Latest 作为默认标签。
用docker运行一个程序的过程:
去仓库把镜像拉到本地,然后用一条命令把镜像运行起来,变成容器。
image.png
docker 安装
清华源帮助文档
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
移除系统自带docker
yum remove docker docker-common docker-selinux docker-engine
下载依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
下载docker的repo源
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
下载地址改为国内清华源
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
生成yum缓存
yum makecache fast
下载docker-ce
yum install docker-ce -y
查看docker版本
docker version
19.03
运行docker
systemctl start docker
国内远镜像加速配置
国内镜像加速可以使用的地址很多,163、阿里云、华为云、腾讯云等等。
我使用的华为云加速地址,然后加载配置文件重启容器引擎。
[root@docker-01 ~]# cat /etc/docker/deamon.json
{
"registry-mirrors": ["https://08ce8043c80010600f40c017d5915f2.mirror.swr.myhuaweicloud.com"]
}
[root@docker-01 ~]# systemctl daemon-reload
[root@docker-01 ~]# systemctl restart docker
运行第一个容器
docker run alpine /bin/echo "Hello world"
Alpine小型linux操作系统,在alpine系统中用echo运行"hello world"
镜像相关命令
搜索镜像(选择官方,start分高的)
docker search centos
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否docker官方发布
STARS: 类似Github里面的star,表示点赞、喜欢的意思
AUTOMATED: 自动构建
image.png
-----search无法查看镜像版本,用浏览器打开docker官网查看比较慢,推荐使用jq命令
yum install jq
下面命令可以查看到centos镜像可用的版本
curl -s https://registry.hub.docker.com/v1/repositories/centos/tags|jq
获取镜像
docker pull centos 不加版本号默认下载最新版本
docker pull centos:7
导出镜像
docker save centos:7 -o centos-v7.tar
docker save centos:7 > centos-v7.tar
导入镜像
docker load -i centos-v7.tar
docker load < centos-v7.tar
删除镜像
docker rmi centos:7
容器相关命令
启动容器
docker run centos:7 /bin/bash (但是这个会退出,并且进入容器一退出容器也关闭)
那为什么启动后就结束了并且夯住???
1. 需要加-d的参数放到后台执行
2. 对于容器来说,如果容器里的pid为1的进程退出了,则容器就退出了
写一个不退出并放到后台运行的docker运行的命令:
docker run -d centos:7 tail -f
docker 命令
run 运行一个容器
-d 放到后台运行
centos:7 镜像版本
tail -f 容器执行的第一个命令(pid为1的进程),如果这个命令退出,容器就退出
上面用tail -f当第一个进程比较的low,因为我们可能不需要tail -f这个命令,用的只是因为它不退出保持我们容器不也不退出。
正常的写法:
docker run -i -t -d centos:7 /bin/bash
-t 分配一个虚拟的终端
-i 保持交互的终端是打开的状态
以上两个参数都是放在一起使用表示打开一个伪终端 docker run -it -d centos:7
命名容器名字
如不自己自定义容器命令 会随机生成,方便查看就自定义;名字不能重复。
[root@docker-01 ~]# docker run -it -d --name abc centos:7
命令容器名字叫abc,参数--name
查看正在运行的容器
docker ps
查看运行和停止的容器
docker ps -a
查看正在运行的容器的ID
docker ps -q
进入容器
docker exec -it 容器ID /bin/bash
停止容器
docker stop 容器ID
启动停止的容器
docker start 容器ID
删除容器
docker rm 容器ID
只能删除停止的容器
批量停止所有运行的容器
docker stop $(docker ps -q)
批量删除所有停止的容器
docker rm $(docker ps -a -q)
查看容器/镜像详细信息
docker inspect 容器ID
容器的端口映射
设置一下nginx的环境
首先我们设置一个环境,在容器里运行一个nginx然后将宿主机的端口映射到nginx的端口
docker pull nginx
docker inspect nginx
...
...
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
...
...
nginx -g "daemon off"
运行nginx镜像时nginx默认使用的是前台运行命令这样命令不退出容器也不会退出 所以不用运行时不用-it的参数
运行nginx
docker run -d nginx
但是没有办法访问容器里面的nginx,需要端口映射。
先关闭nginx容器,然后用端口映射的方式启动
指定端口映射
docker run -p 8080:80 -d nginx:latest
随机端口映射
docker run -P -d nginx:latest
访问宿主机的映射端口就可以访问到容器里的nginx了
可以映射多个端口
[root@docker-01 ~]# docker run -d -p 80:80 -p 8080:8080 -p 8090:8090 nginx:latest
image.png
容器的目录映射
宿主机的目录映射到容器的目录
此时的容器的nginx的html目录是首页文件,我可以映射宿主机的目录到容器的目录,这样我就不需要进入进行操作了,直接在宿主机的目录就可以操作了。
image.png
举例:宿主机的/data目录映射到/usr/share/nginx/html目录(可以理解成挂载)
mkdir /data/ -p
docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
docker ps
image.png
那我们对宿主机的/data目录进行操作,相当于在操作容器的/usr/share/nginx/html目录
[root@docker-01 ~]# echo 'hello docker' >/data/index.html
然后访问容器的nginx,这样我们就不用进容器里面操作了
image.png
映射多个目录和文件
[root@docker-01 ~]# docker run -d -p 80:80 -p 8080:8080 -v /data/www:/opt/www -v /data/abc:/opt/abc -v /etc/abc.txt:/etc/abc.txt nginx:latest
可以映射文件到容器nginx的配置文件,然后映射目录到容器nginx的html目录
比如 创建nginx的配置文件进行映射 然后再映射站点目录。(举例说明不用纠结配置文件和game和xiaoniao这两个游戏)
创建nginx配置文件
cat >/data/game.conf<<EOF
server {
listen 8080;
server_name localhost;
location / {
root /opt/game/;
index index.html index.htm;
}
}
server {
listen 8090;
server_name localhost;
location / {
root /opt/xiaoniao/;
index index.html index.htm;
}
}
EOF
运行容器
docker run -d -p 8080:8080 -p 8090:8090 -v /data/xiaoniao:/opt/xiaoniao -v /data/game:/opt/game -v /data/game.conf:/etc/nginx/conf.d/game.conf nginx:latest
基于centos自定义镜像
1.首先pull官方的centos镜像
2.运行centos镜像并进入容器
3.进入镜像进行我们需要的操作(搭建环境、安装软件、修改配置、上传文件数据等)
4.基于容器生成镜像 (docker commit 容器ID 镜像名:版本号)
5.导出镜像(docker save)
5.其他环境使用镜像直接导入镜像(docker load),然后运行,方便操作。
比如在centos镜像安装nginx,然后进行了系统的常见命令安装nginx,然后根据容器生成镜像。(为了理解容器做的简单只安装了nginx,感兴趣可以对nginx进行优化或者下载其他软件,原理是一样的)
运行一个centos容器,进入容器
docker run -it centos:7 /bin/bash
下载常用命令和配置yum源
yum install wget install openssh-clients -y
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
配置nginx的yum源
cat >/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
生成缓存
yum makecache fast
下载nginx
yum install nginx -y
查看运行容器
docker ps
生成自定义镜像,命令为game版本是V1
docker commit 容器ID nginx:v1
查看镜像
docker images
导出镜像
docker save nginx:v1 > nginx-v1.tar
如果使用自定义的镜像按以下操作就可以
导入镜像
docker load < nginx-v1.tar
运行镜像(nginx -g 'daemon off;'前台执行 )
docker run -p 80:80 -d nginx:v1 nginx -g 'daemon off;'
手动自定义云盘镜像
在容器中搭建php+nginx的架构运行云盘软件的代码
运行一个centos7镜像的容器
docker run -it centos:7 /bin/bash
在容器中下载常用功能
yum install wget install openssh-clients unzip -y
配置yum源
rm -rf /etc/yum.repos.d/*
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
配置nginx源
cat >/etc/yum.repos.d/nginx.repo<<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
EOF
生成缓存
yum makecache fast
下载php和php插件还有nginx
yum install nginx php-fpm php-mbstring php-gd -y
替换php用户为nginx
sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf
sed -i '/daemonize/s#no#yes#g' /etc/php-fpm.conf
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
ps -ef|grep php
生成nginx配置文件
cat> /etc/nginx/conf.d/cloud.conf <<EOF
server {
listen 80;
server_name localhost;
root /code/kod;
index index.php index.html;
location ~ \.php\$ {
root /code/kod;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
删除nginx默认配置文件
rm -rf /etc/nginx/conf.d/default.conf
nginx语法检查
nginx -t
启动nginx
nginx
创建站点目录
mkdir /code/kod
拉取云盘软件
scp 10.0.1.201:/data/kodexplorer4.40.zip
解压
unzip kodexplorer4.40.zip -d /code/kod
站点目录授权
chown -R nginx:nginx /code/
写启动的脚本(启动php、前台运行nginx)
cat >init.sh<<EOF
#!/bin/bash
php-fpm -c /etc/php.ini -y /etc/php-fpm.conf
nginx -g 'daemon off;'
EOF
给脚本执行权限
chmod +x init.sh
到宿主机创建镜像
docker commit 9e691858a4bd kod:v1
运行镜像
docker run -p 80:80 -d kod:v1 /bin/bash /root/init.sh
需要将站点目录做映射也可以
docker run -p 80:80 -v /data/kod/data:/code/kod/data/ -d kod:v1 /bin/bash /root/init.sh
dockerfile
使用dockerfile制作云盘镜像
Docker 通过对于在 Dockerfile 中的一系列指令的顺序解析实现自动的 image 的构建
通过使用 build 命令,根据 Dockerfile 的描述来构建镜像
网友评论