docker

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.png

docker有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 的描述来构建镜像
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 1、分别使用lxc容器和docker容器搭建nginx服务,能够正常访问到容器内的web服务 下载docker-c...
    stephe_c阅读 813评论 0 0
  • 1....................................................... ...
    teddy09阅读 148评论 0 0
  • 目录 八、数据管理九、数据卷备份恢复十、Docker网络模式十一、opration not permmited十二...
    XiaoMing丶阅读 1,093评论 0 0
  • docker(dockerfile,镜像库、网络安装部署) 1. Docker介绍 1.1 什么是容器? 1.2 ...
    呆呆了阅读 237评论 0 0
  • 一 Docker安装步骤解析 1.1 基础命令 1.1.1 Docker安装前置任务 #使用uname -r ...
    云淡风轻Jackzz阅读 394评论 0 0