docker for centos7

据官方所说,docker在新版本的ubuntu和centos7上表现更好,鉴于我们目前使用的系统是centos6.8,这次我们选择centos7作为docker的宿主系统.

安装

准备工作

删除原来的docker包,一般情况下不用,保险起见,最好按流程走一下

$ sudo yum -y remove docker docker-common container-selinux

删除docker的selinux 同上

$ sudo yum -y remove docker-selinux

开始安装了

使用yum 安装yum-utils

$ sudo yum install -y yum-utils

增加docker源

$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

查看docker源是否可用

$ sudo yum-config-manager --enable docker-ce-edge
enable 为True就行

创建缓存

$ sudo yum makecache fast

使用yum安装

docker现在分为两个版本 EE(企业版) CE(社区版),这里我们选择CE版.

$ sudo yum install docker-ce

启动docker

$ sudo systemctl start docker

启动一个helloword

$ sudo docker run hello-world

这条命令会下载一个测试镜像,并启动一个容器,输出hello world 并退出,如果正常说明docker安装成功.

使用docker

使用国内源加速

由于众所周知的原因,国内使用docker的官方源会非常慢,有时候甚至不能连接,因此我们需要使用国内源加速,基于我对阿里相对好的印象,这里我们选择阿里云的docker加速,另外推荐的还有daoCloud的加速,据说也不错.

通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ik8akj45.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

tips

导入导出镜像

导入导出镜像

# 导出
$ docker save images > lnmp.tar.gz
# 导入
$ docker load -qi lnmp.tar

docker 常用命令

引用一下一个前辈的总结,docker的命名主要分为以下几类

  • 容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]
  • 容器操作运维 — docker [ps|inspect|top|attach|events|logs|wait|export|port]
  • 容器rootfs命令 — docker [commit|cp|diff]
  • 镜像仓库 — docker [login|pull|push|search]
  • 本地镜像管理 — docker [images|rmi|tag|build|history|save|import]
  • 其他命令 — docker [info|version]

下面具体说明下docker的基本命令

docker 镜像命令

$ sudo docker images 列出机器上的镜像
$ sudo docker search centos 所有镜像
$ sudo docker pull centos 拉取镜像
$ sudo docker history centos7 查看针对于一个镜像的历史操作
$ sudo docker pull dl.dockerpool.com:5000/mongo:latest 从私服拉取镜像
$ sudo docker inspect centos 获取镜像详细信息
$ sudo docker rmi centos 删除镜像 如果有使用这个镜像构建的容器,就不能删除,非要删除的话可以加上 -f 参数,不过 不建议这样操作.
$ sudo docker tag centos centos7 给镜像创建tag,细心的人可以看到镜像id是一致的,说明这还是一个镜像
$ sudo docker save images > lnmp.tar.gz 导出镜像
$ sudo docker load -qi lnmp.tar 导入镜像
# 推送镜像
$ docker push seanlook/mongo
$ docker push registry.tp-link.net:5000/mongo:2014-10-27
# 创建镜像 三种方式
1. 启动一个容器 并在其中进行修改等写入操作 退出 记住容器id 然后提交镜像
$ sudo docker commit -m "Add a test file" -a "I am nick" 容器id test
顺利的话会返回新创建的id信息
然后在本地查看镜像列表,就可以看到新的镜像了
2.使用本地模板导入 推荐下载openvz模板来创建
导入命令
$ cat centos-6.8-minimal.tar.gz |sudo docker import - centos:6.8
然后查看镜像列表,镜像已经存在了.
3. 使用dockerfile 构建镜像

容器命令

$ sudo docker rm 132b910b1ad6     删除容器
$ sudo docker start e86f7599efe9 启动一个容器
$ sudo docker create centos7 创建一个容器 默认是停止状态 可以使用上面的命令启动它
$ sudo docker run -ti 98d35105a391 /bin/echo "hehe" 启动一个容器,输出 hehe 然后退出
$ sudo docker run -ti 98d35105a391 /bin/bash 启动一个容器 -t 让命令分配一个伪终端 -i 让容器的标准输入保持打开
$ sudo docker run -d --name ugg centos7 /bin/bash -c "while true; do echo hello world; sleep 2; done" 后台启动一个名为ugg的docker容器 连入之后 会一直输出hello world 使用ctrl+p ctrl+q 退出到宿主机,Ctrl+C 退出输出
$ sudo docker attach e86f7599efe9 连接一个容器的终端 attach 在多个窗口同时attach一个容器的时候,所有窗口都会同步显示,其中一个窗口阻塞时,其它窗口也没有办法操作,因此推荐使用 exec
$ sudo docker exec -ti 6fdc63f3a4df /bin/bash 基本等同于attach 但是是真正独立的shell
$ sudo docker stop ugg 停止一个容器
$ sudo docker export rose > /tmp/rose.tar 导出一个容器
$ cat /tmp/rose.tar |sudo docker import /tmp/rose.tar rosex 导入一个容器为镜像,rosex为镜像名称

查看容器ip

$ sudo docker inspect homepage |grep \"IPAddress\" |head -1 |awk '{print $2}' |awk -F "\"" '{print $2}'   # homepage是容器名称

执行完删除容器

在执行容器的时候加上 -- rm 参数 -- rm 和 -d 参数不能同时使用

容器的名称是唯一的,想创建一个名称已存在的容器,必须先删除已经存在那个容器

docker 容器重启IP会变,这个一定要注意,不然踩大坑.

docker 简单应用

实例一 使用docker运行一个静态网站

这个例子主要是可以让我们学会使用docker 映射端口

和如何创建一个支持ssh的容器

创建一个容器

# 这个不一定能用,下面有说明
$ sudo docker run -p 8100:8100 -p 2200:2200 -ti --name homepage centos7

连入容器

$ sudo docker exec -ti bfaedade67b9 /bin/bash

修改容器的root密码

# passwd root

安装ssh

# yum -y install openssh-server openssh-clients

安装nginx

# yum install nginx
nginx默认root在这里,嫌麻烦的直接可以在这里编辑或者把网站文件放这里
/usr/share/nginx/html

nginx 启动 8100端口 sshd启动 2200端口

修改ssh配置文件

$ vi /etc/ssh/sshd_config

RSAAuthentication yes #启用 RSA 认证
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/authorized_keys #公钥文件路径(和上面生成的文件同)
PermitRootLogin yes #root能使用ssh登录

这里提一个bug,就是sshd在容器中不能启动,这个的原因是因为dbus-daemon没能启动。其实systemctl并不是不可以使用。将你的CMD或者entrypoint设置为/usr/sbin/init即可。会自动将dbus等服务启动起来。

所以将上面的创建镜像命令改成

$ sudo docker run -d -p 8100:8100 -p 2200:2200 -ti --name homepage --privileged -ti -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup centos7 /sbin/init

不过这个又带来了另一个问题 agetty CPU占用率100% 参考:http://blog.chinaunix.net/uid-26212859-id-5759744.html

原因就是 "docker run"运行容器时使用了 "/sbin/init"和"--privileged"参数

使用/sbin/init启动容器并加上--privileged参数,相当于docker容器获得了宿主机的全权委托权限。这时docker容器内部的init与宿主机的init产生了混淆。

出于对安全的考虑,在启动容器时,docker容器里的系统只具有一些普通的linux权限,并不具有真正root用户的所有权限。而--privileged=true参数可以让docker容器具有linux root用户的所有权限。

为了解决这个问题,docker后来的版本中docker run增加了两个选项参数"--cap-add"和"--cap-drop"。

--cap-add : 获取default之外的linux的权限
--cap-drop: 放弃default linux权限
所以,在运行容器时,可以不用--privileged参数的尽量不用,用--cap-add参数替代。如果必须使用--privileged=true参数的,可以通过在宿主机和容器中执行以下命令将agetty关闭。
shell> systemctl stop getty@tty1.service
shell> systemctl mask getty@tty1.service

docker vim 中文乱码的解决方案

$ vim .vimrc
加入以下几行设置即可 set fileencodings=ucs-bom,utf-8,gbk,gb2312,cp936,gb18030,big5,latin-1
set encoding=utf-8
set termencoding=utf-8
set fileencoding=utf-8

这些搞完了,就可以看你的网站了.

实例二 使用docker实现lnmp站点搭建

通过这个实例可以学习到容器之间如何互联

还有如何在多台机器上部署lnmp环境

将上一个容器导出

$ sudo docker export homepage > /tmp/web.tar

把这个容器导入为一个镜像

$ cat /tmp/web.tar |sudo docker import  /tmp/web.tar web

使用这个镜像启动一个容器

#这个容器里面启动的端口可能跟映射的不一样,可以进去改一下,这个容器启一个mysql服务
$ sudo docker run -d -p 8110:8110 -p 2210:2210 -p 3316:3316 -ti --name homepage01 --privileged -ti -e "container=docker" -v /sys/fs/cgroup:/sys/fs/cgroup web /sbin/init

再用这个镜像启动一个容器,这个容器需要php 和 需要连接数据库的代码

$ sudo docker run  -d -p 8120:8120 -p 2220:2220 -p 3326:3326 -ti --name homepage02 --link homepage01:homepage01 --privileged  -ti -e "container=docker"  -v /sys/fs/cgroup:/sys/fs/cgroup web /sbin/init

连进homepage02容器,使用env 命令可以看到homepage02和homepage01的连接

$ sudo docker exec -ti homepage01 /bin/bash
$ env

ping homepage01 会解析为homepage01的IP

用户可以链接多个子容器到父容器,比如多个web连接到db容器上

这些做完后,你可以给homepage01装一个myql

# 端口号为映射的3316
$ yum install mariadb-server -y
# centos7 自带的是mariadb
# 启动 systemctl start mariadb.service
# 开机启动 systemctl enable mariadb.service
# 修改密码 mysql_secure_installation

mariadb的授权不太一样,搞了半天,老外套路太深...

$ create user root@'172.17.0.4' identified by '123456';
$ grant all privileges on *.* to root@'172.17.0.4';

在给homepage02 装上nginx 和php

# nginx 端口为映射的8120
$ yum install php php-fpm ninx
$ systemctl start nginx
$ systemctl start php-fpm

注意 连接MySQL要注意端口号.

需要安装PHP的MySQL扩展 php-mysql

完成之后启动服务,打开浏览器输入地址,就可以看到我们的PHP项目了.

Dockerfile

如果docker是原子弹的话,那么dockerfile就是核弹头,不使用dockerfile的话,docker永远只是玩具.

使用Dockerfile可以允许用户创建自定义的镜像

Dockerfile一般由一条条语句组成,并支持以 # 开头的注释行

一般来说Dockerfile分为四部分

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像操作指令
  4. 容器启动时执行指令

下面是一个简单的例子,具体操作也可以参考这个

# 基于某个镜像
# FROME centos:tag 这样可以指定版本
FROM centos:6 # 将维护人员信息写到镜像中,当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
MAINTAINER NGINX Docker Maintainers "colder219@163.com" ENV NGINX_VERSION 1.10.1-1 # 构建指令,RUN可以运行任何被基础image支持的命令。
# 如基础image悬选择了Centos,那么软件管理部分只能使用Centos的命令。
# 该指令有两种格式
# RUN <command> (the command is run in a shell - `/bin/sh -c`)
# RUN ["executable", "param1", "param2" ... ] (exec form)
RUN yum install -y epel-release
RUN yum install -y nginx
RUN sed -i "s/80/8200/g" /etc/nginx/conf.d/default.conf
RUN chkconfig nginx on CMD ["nginx", "-g", "daemon off;"] EXPOSE 8200

开始构建

Dockerfile文件在/root目录下

$ sudo docker build -t dblue/centos-nginx /root

现在看看是不是多了个镜像

$ sudo docker images

使用这个镜像,启动一个服务

$ sudo docker run  -d -p 8200:8200 -ti --name test000  -ti dblue/centos-nginx

打开浏览器输入: http://10.211.55.6:8200 看到下面的页面,说明就成功了.

docker for centos7的更多相关文章

  1. docker(一) Centos7下安装docker

    docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...

  2. docker启动centos7后sudo不能使用

    docker启动centos7后sudo不能使用 过程 使用docker -it xxx /bin/sh进入centos镜像,然后安装了docker,想使用systemctl start docker ...

  3. Docker - 在CentOS7中安装Docker

    在CentOS 7中安装Docker 1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname - ...

  4. Docker安装 - CentOS7环境

    Docker安装 - CentOS7环境 安装Docker 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核 ...

  5. 【Docker】 CentOS7 安装 Docker 及其使用方法 ( 一 )

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  6. 【Docker】CentOS7 上无网络情况下安装

    自建虚拟机,但是连接不上网络,只能通过下载rpm包进行安装docker 环境:CentOS 7.3.1611 x64 rpm镜像下载地址用的阿里的https://mirrors.aliyun.com/ ...

  7. 在 Docker 的 CentOS7 镜像 中安装 mysql

    在 Docker 的 CentOS7 镜像 中安装 mysql 本来以为是个很简单的过程居然折腾了这么久,之前部署云服务器时也没有好好地记录,因此记录下. 特别提醒:本文的操作环境是在 Docker ...

  8. docker在centos7下的一些坑

    在centos的docker上安装mysql提示chown mod /var/lib/mysql permission denied,通过下面的方法1解决. 在centos上挂载数据卷,在容器内部访问 ...

  9. docker在CentOS7下部署指南

    docker只支持CentOS7.x系统,所以近期根据docker官网指南自己搭建了一套,供大家参考. 1.部署Centos7.x系统,查看系统版本. 2.执行 sudo yum update 更新到 ...

随机推荐

  1. legend---十、thinkphp中如何进行原生sql操作

    legend---十.thinkphp中如何进行原生sql操作 一.总结 一句话总结:query方法和execute方法 Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 quer ...

  2. 记录一下c++的一点指针所得

    c++有两种传值可以改变外部参数,一种是传递指针,另一种是传递引用,对于前者,可以用Ugly(but explicitly),对于后者,Clean(but hidden),在传递的时候有一种值得注意的 ...

  3. JavaScript中Math常用方法

    title: JavaScript中Math常用方法 toc: false date: 2018-10-13 12:19:31 Math.E --2.718281828459045,算数常量e Mat ...

  4. Nashorn——在JDK 8中融合Java与JavaScript之力--转

    原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...

  5. jQuery学习(二)——使用JQ完成页面定时弹出广告

    1.JQuery效果 2.步骤分析: 第一步:引入jQuery相关的文件 第二步:书写页面加载函数 第三步:在页面加载函数中,获取显示广告图片的元素. 第四步:设置定时操作(显示广告图片的函数) 第五 ...

  6. JavaScript学习——使用JS完成页面定时弹出广告

    1.获取图片的位置(document.getElementById(“”))  隐藏图片:display:none 定时操作:setInterval(“显示图片的函数”,3000); 2.步骤分析 ( ...

  7. asp.net 连接字符串的多种写法

    一.使用OleDbConnection对象连接OLE DB数据源 1.连接Access 数据库 Access 2000: “provider=Microsoft.Jet.Oledb.3.5;Data ...

  8. HDU 2120 Ice_cream's world I【并查集】

    解题思路:给出n对点的关系,求构成多少个环,如果对于点x和点y,它们本身就有一堵墙,即为它们本身就相连,如果find(x)=find(y),说明它们的根节点相同,它们之间肯定有直接或间接的相连,即形成 ...

  9. 洛谷P3369 【模板】普通平衡树 01trie/骚操作

    Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...

  10. 关于CAS操作

    在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...