docker for centos7
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分为四部分
- 基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
下面是一个简单的例子,具体操作也可以参考这个
# 基于某个镜像
# 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的更多相关文章
- docker(一) Centos7下安装docker
docker(一) Centos7下安装dockerdocker(二) windows10下安装dockerdocker(三) 镜像和容器常用命令 docker(四) 使用Dockerfile构建镜像 ...
- docker启动centos7后sudo不能使用
docker启动centos7后sudo不能使用 过程 使用docker -it xxx /bin/sh进入centos镜像,然后安装了docker,想使用systemctl start docker ...
- Docker - 在CentOS7中安装Docker
在CentOS 7中安装Docker 1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname - ...
- Docker安装 - CentOS7环境
Docker安装 - CentOS7环境 安装Docker 我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核 ...
- 【Docker】 CentOS7 安装 Docker 及其使用方法 ( 一 )
系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...
- 【Docker】CentOS7 上无网络情况下安装
自建虚拟机,但是连接不上网络,只能通过下载rpm包进行安装docker 环境:CentOS 7.3.1611 x64 rpm镜像下载地址用的阿里的https://mirrors.aliyun.com/ ...
- 在 Docker 的 CentOS7 镜像 中安装 mysql
在 Docker 的 CentOS7 镜像 中安装 mysql 本来以为是个很简单的过程居然折腾了这么久,之前部署云服务器时也没有好好地记录,因此记录下. 特别提醒:本文的操作环境是在 Docker ...
- docker在centos7下的一些坑
在centos的docker上安装mysql提示chown mod /var/lib/mysql permission denied,通过下面的方法1解决. 在centos上挂载数据卷,在容器内部访问 ...
- docker在CentOS7下部署指南
docker只支持CentOS7.x系统,所以近期根据docker官网指南自己搭建了一套,供大家参考. 1.部署Centos7.x系统,查看系统版本. 2.执行 sudo yum update 更新到 ...
随机推荐
- legend---十、thinkphp中如何进行原生sql操作
legend---十.thinkphp中如何进行原生sql操作 一.总结 一句话总结:query方法和execute方法 Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 quer ...
- 记录一下c++的一点指针所得
c++有两种传值可以改变外部参数,一种是传递指针,另一种是传递引用,对于前者,可以用Ugly(but explicitly),对于后者,Clean(but hidden),在传递的时候有一种值得注意的 ...
- JavaScript中Math常用方法
title: JavaScript中Math常用方法 toc: false date: 2018-10-13 12:19:31 Math.E --2.718281828459045,算数常量e Mat ...
- Nashorn——在JDK 8中融合Java与JavaScript之力--转
原文地址:http://www.infoq.com/cn/articles/nashorn 从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性 ...
- jQuery学习(二)——使用JQ完成页面定时弹出广告
1.JQuery效果 2.步骤分析: 第一步:引入jQuery相关的文件 第二步:书写页面加载函数 第三步:在页面加载函数中,获取显示广告图片的元素. 第四步:设置定时操作(显示广告图片的函数) 第五 ...
- JavaScript学习——使用JS完成页面定时弹出广告
1.获取图片的位置(document.getElementById(“”)) 隐藏图片:display:none 定时操作:setInterval(“显示图片的函数”,3000); 2.步骤分析 ( ...
- asp.net 连接字符串的多种写法
一.使用OleDbConnection对象连接OLE DB数据源 1.连接Access 数据库 Access 2000: “provider=Microsoft.Jet.Oledb.3.5;Data ...
- HDU 2120 Ice_cream's world I【并查集】
解题思路:给出n对点的关系,求构成多少个环,如果对于点x和点y,它们本身就有一堵墙,即为它们本身就相连,如果find(x)=find(y),说明它们的根节点相同,它们之间肯定有直接或间接的相连,即形成 ...
- 洛谷P3369 【模板】普通平衡树 01trie/骚操作
Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...
- 关于CAS操作
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2 ...