opsnotes 写了好多基础篇
docker
http:
/
/
opsnotes.net
/
2015
/
07
/
06
/
docker_install
/
牛刀小试之docker安装部署
docker pull ubuntu:
12.04
docker pull dl.dockerpool.com:
5000
/
ubuntu:
12.04
docker run
-
t
-
i ubuntu:
12.04
/
bin
/
bash
docker images
docker run ubuntu:
12.04
/
bin
/
echo
"hello world"
docker ps a
docker export
7582b0eaf376
> ubuntu.tar
cat ubuntu.tar | docker
import
-
test
/
buntu:v1.
0
docker rmi test
/
buntu:v1.
0
docker search centos
docker pull centos
牛刀小试之docker镜像相关配置
docker pull ubuntu:
12.10
如上命令相当于docker pull registry.hub.docker.com
/
ubuntu:latest.是从docker默认的服务器下载latest镜像
也可以从dockerpool地方下载镜像
docker run
-
t
-
i ubuntu
/
bin
/
bash
docker inspect
6d4946999d4f
docker search mysql
可以看到很多关键字的镜像 包括名字 描述 和镜像的使用欢迎度 是否官方创建,感觉是不是有点像github
-
-
automated
=
false 只显示自动创建的镜像
-
-
no
-
trunc
=
false 输出信息不截断显示
-
s,
-
-
stars
=
0
显示指定星级的镜像
使用
-
f 可以强制删除,但是需要注意的是,强制删除会造成一些相关遗留的问题
docker run
-
ti ubuntu:
14.04
/
bin
/
bash
docker commit
-
m
'added a new file'
-
a
'docker Steven'
c72ad6c5adcd test
docker images test
牛刀小试之docker容器增加删除
docker create
-
it ubuntu:latest
启动容器有两种方式
1.
基于镜像新建一个容器并且启动
2.
把在终止的状态容器重新启动
docker run 相当于 docker create
+
docker start
docker run ubuntu
/
bin
/
echo
"hello world"
登陆到交互式模式下面,
-
t 让docker分配一个伪终端,并绑定到容器的标准输出上
-
i 让容器的标准输出打开
可以是用crtl
+
d 或者exit退出,需要注意的是,退出意味着终止
docker run
-
ti ubuntu:
14.04
/
bin
/
bash
有时候为了业务方便可以使用”
-
d“参数来后台启动
docker run
-
d ubuntu
/
bin
/
bash
-
c
"while true; do echo Hello world; sleep 1; done"
docker logs
6aa
连接的
ID
docker ps
-
a
-
q
docker restart
6aa
会将运行的容器终止,然后再重新启动它
docker rm
-
f
436efb7b9933
0aced9db36e2
b89ee17998ec
牛刀小试之docker基于容器备份与恢复之export
import
docker export a457 > test_for_run.tar
cat test_for_run.tar | docker
import
-
test
/
ubuntu:v1.
0
docker images test
/
ubuntu
建议在上传环境中 因容器是轻量级的,建议可以做成HA 这样就可以防止单点故障。在容器故障的时候,可以快速的切换到其他的容器
牛刀小试之docker容器的连接方式
docker run
-
idt ubuntu
docker
1.3
版本之后自带命令,可以在容器直接运行命令,启动一个bash,
exec
工具相对比较简单
docker
exec
-
ti
7d3d35cb9c40
/
bin
/
bash
nsenter工具安装使用
把如下内容复制到“
/
usr
/
local
/
bin
/
docker
-
enter”下面。
[root@test
-
devops ~]
if
[
-
e $(dirname
"$0"
)
/
nsenter ]; then
NSENTER
=
$(dirname
"$0"
)
/
nsenter
else
NSENTER
=
nsenter
fi
if
[
-
z
"$1"
]; then
echo
"Usage: `basename "
$
0
"` CONTAINER [COMMAND [ARG]...]"
echo ""
echo
"Enters the Docker CONTAINER and executes the specified COMMAND."
echo
"If COMMAND is not specified, runs an interactive shell in CONTAINER."
else
PID
=
$(docker inspect
-
-
format
"u"
{
%
raw
%
}
"``.`State`.`Pid`"
"$1"
)
if
[
-
z
"$PID"
]; then
exit
1
fi
shift
OPTS
=
"--target $PID --mount --uts --ipc --net --pid --"
if
[
-
z
"$1"
]; then
"$NSENTER"
$OPTS su
-
root
else
"$NSENTER"
$OPTS env
-
-
ignore
-
environment
-
-
"$@"
fi
fi
chmod
+
x
/
usr
/
local
/
bin
/
docker
-
enter
docker run
-
idt ubuntu
docker
-
enter a457769fdd92
牛刀小试之docker数据卷容器共享
数据卷可以在容器之间共享和重用
对数据卷的修改会立马生效
对数据卷的更新不会影响镜像
卷会一直存在,直到没有容器使用
在docker run 启动的时候 可以加
-
v参数来创建一个容器卷。注意多次创建可以使用
-
v标记多个数据卷
docker run
-
d
-
P
-
-
name web
-
v
/
webapp training
/
webapp echo
"hello world"
本地硬盘挂载
docker run
-
d
-
P
-
-
name web
-
v
/
srv
/
webapp:
/
opt
/
webapp
/
training
/
webapp echo
"hello world"
本地硬盘挂载一个只读的
-
ro参数
[root@docker ~]
挂载一个本地主机文件作为数据卷,建议一般不要挂载一个文件
[root@docker ~]
实战案例: 数据卷容器
场景:
如果用户需要在容器之间共享一些持续更新的数据,最简单的办法就是使用数据卷容器。数据卷容器就是一个普通的容器。专门用它提供数据卷供其他容器挂载使用。
优点:
使用数据卷容器可以让用户在容器之间自由的升级和移动数据卷。
mkdir
/
dbdata
docker run
-
it
-
v
/
dbdata
/
-
-
name dbdata centos:
6
docker run
-
it
-
-
volumes
-
from
dbdata
-
-
name db1 centos:
6
exit
docker run
-
it
-
-
volumes
-
from
dbdata
-
-
name db2 centos:
6
exit
启动容器
docker start
96513f616aa4
98a6cca3fee3
a85c2ed8df59
使用docker
-
enter 登陆到db1 在dbdata下面创建一个目录uptime
在其他两台机器查看
使用dockerfile创建基于ubuntu的ssh容器
touch Dockerfile run.sh
cat run.sh
chmod
400
authorized_keys
编写dockerFile
[root@test
-
devops sshd_ubuntu]
FROM ubuntu:
14.04
MAINTAINER
from
steven (www.opsnotes.net)
RUN apt
-
get install
-
y openssh
-
server vim
RUN mkdir
-
p
/
var
/
run
/
sshd
RUN mkdir
-
p
/
root
/
.ssh
RUN echo
'root:123qwer'
|chpasswd
RUN sed
-
i
"s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g"
/
etc
/
ssh
/
sshd_config
RUN sed
-
i
"s/UsePAM.*/UsePAM no/g"
/
etc
/
ssh
/
sshd_config
RUN sed
-
i
's/^PermitRootLogin without-password/PermitRootLogin yes/g'
/
etc
/
ssh
/
sshd_config
RUN sed
-
i
'/pam_loginuid.so/c session optional pam_loginuid.so'
/
etc
/
pam.d
/
sshd
ADD authorized_keys
/
root
/
.ssh
/
authorized_keys
ADD run.sh
/
run.sh
RUN chmod
+
x
/
run.sh
EXPOSE
22
CMD [
"/run.sh"
]
创建镜像
docker build
-
t sshd:dockerfile .
测试镜像,运行容器
docker run
-
d
-
p
10122
:
22
sshd:dockerfile
netstat
-
tlnp
登陆
ssh
-
p
10122
root@
121.41
.
118.184
docker commit 创建基于ubuntu的ssh镜像
docker run
-
it ubuntu:
14.04
/
bin
/
bash
vi
/
root
/
.ssh
/
authorized_keys 客户端的公钥放到里面,那台机器需要登陆就需要登陆的public放到里面
docker commit fb0 ubuntu_sshd:
14.04
启动镜像,本地的
10022
端口绑定到docker容器的
22
端口
docker run
-
p
10022
:
22
-
d ubuntu_sshd:
14.04
/
ssh.sh
ssh
-
p
10022
root@
121.41
.
118.184
使用dockerfile创建基于centos的ssh容器
打包的镜像需要支持SSH key和密码登录
编写Dockerfile文件
[root@test
-
devops sshd_centos]
FROM centos:
6
MAINTAINER steven <www.opsnotes.net>
RUN yum install
-
y openssh
-
server openssh
-
clients vim
RUN mkdir
-
p
/
root
/
.ssh
/
ADD authorized_keys
/
root
/
.ssh
/
authorized_keys
RUN ssh
-
keygen
-
f
/
etc
/
ssh
/
ssh_host_rsa_key
RUN ssh
-
keygen
-
t dsa
-
f
/
etc
/
ssh
/
ssh_host_dsa_key
RUN echo
'root:123qwer'
|chpasswd
RUN sed
-
i
"s/#UsePrivilegeSeparation.*/UsePrivilegeSeparation no/g"
/
etc
/
ssh
/
sshd_config
RUN sed
-
i
"s/UsePAM.*/UsePAM no/g"
/
etc
/
ssh
/
sshd_config
RUN sed
-
i
'/pam_loginuid.so/c session optional pam_loginuid.so'
/
etc
/
pam.d
/
sshd
ADD run.sh
/
run.sh
RUN chmod
+
x
/
run.sh
EXPOSE
22
CMD [
"/run.sh"
]
docker build
-
t
'sshd/centos62'
.
查看镜像是否创建成功
[root@test
-
devops sshd_centos]
启动docker容器
[root@test
-
devops sshd_centos]
测试,可以测试key登录以及密码登录
ssh
-
p
10125
root@
121.41
.
118.184
zhangkeyuan@opsnotes:~ ssh
-
p
10125
root@
121.41
.
118.184
docker容器ubuntu安装apache
+
php
[root@test
-
devops apache_ubuntu]
/
home
/
docker
/
apache_ubuntu
[root@test
-
devops apache_ubuntu]
.
├── Dockerfile
├── run.sh
└── sample
├── index.html
└── index.php
[root@test
-
devops apache_ubuntu]
FROM sshd
/
ubuntu
MAINTAINER
from
steven (www.opsnotes.net)
ENV DEBIAN_FRONTEND noninteractive
RUN apt
-
get update && apt
-
get
-
y install apache2 php5 php5
-
cli libapache2
-
mod
-
php5 php5
-
gd php5
-
json php5
-
ldap php5
-
mysql php5
-
pgsql
ADD run.sh
/
run.sh
RUN chmod
+
x
/
*
.sh
RUN rm
-
rf
/
var
/
www
/
html
/
*
COPY sample
/
/
var
/
www
/
html
/
ENV APACHE_RUN_USER www
-
data
ENV APACHE_RUN_GROUP www
-
data
ENV APACHE_LOG_DIR
/
var
/
log
/
apache2
ENV APACHE_PID_FILE
/
var
/
run
/
apache2.pid
ENV APACHE_RUN_DIR
/
var
/
run
/
apache2
ENV APACHE_LOCK_DIR
/
var
/
lock
/
apache2
ENV APACHE_SERVERADMIN admin@opsnotes.net
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT
/
var
/
www
EXPOSE
80
CMD [
"/run.sh"
]
[root@test
-
devops apache_ubuntu]
/
usr
/
sbin
/
sshd &
/
usr
/
sbin
/
apache2ctl
-
D FOREGROUND
[root@test
-
devops apache_ubuntu]
Hello docker
for
apache2
<?php
phpinfo();
?>
docker build
-
t apache
/
ubuntu .
允许DOCKER镜像指定端口以及映射
docker run
-
d
-
p
10122
:
22
-
p
888
:
80
apache
/
ubuntu
docker
-
enter fbe
logout
docker
-
创建nginx镜像
[root@test
-
devops nginx_ubuntu]
.
├── Dockerfile
└── run.sh
[root@test
-
devops nginx_ubuntu]
FROM sshd
/
ubuntu
MAINTAINER
from
steven (www.opsnotes.net)
RUN apt
-
get install
-
y nginx
RUN sed
-
i
's/listen \[\:\:\]:80 default_server ipv6only=on;/#listen \[\:\:\]:80 default_server ipv6only=on;/g'
/
etc
/
nginx
/
sites
-
enabled
/
default
RUN echo
"\ndaemon off;"
>>
/
etc
/
nginx
/
nginx.conf
ADD run.sh
/
run.sh
RUN chmod
+
x
/
*
.sh
WORKDIR
/
etc
/
nginx
EXPOSE
80
CMD [
"/run.sh"
]
[root@test
-
devops nginx_ubuntu]
/
usr
/
sbin
/
sshd &
/
usr
/
sbin
/
nginx
docker build
-
t nginx
/
ubuntu .