container
create
start
stop
restart
pause //中断
unpause //恢复
ls -a /-q/-s
attach
inspect pilipala | grep "MacAdress"
logs -tf pilipala
top
diff //查看文件修改
exec pilipala echo "test_exec" //执行
rm -f $(docjer container ls -aq)
image
docker image ls //查看镜像
docker image pull ubuntu
docker image ls ubuntu
docker image inspect ubuntu //查看镜像信息
docker search ubuntu //搜索
docker image pull ubuntu:14.04 //下载
//构建镜像busybox:test
docker container run --name shiyanlou001 -it busybox /bin/sh
touch test1 test2
//注意点:exit
docker container commit shiyanlou001 busybox:test
docker image ls busybox
//buid镜像
mkdir /home/shiyanlou/test1 && cd /home/shiyanlou/test1
vim Dockerfile
docker image build -t xxx:1.0 . //创建目录编辑dockerfile文件并构建新镜像,'.'是为了说明没有参数,后面network的时候时间可能比较长等一会
docker image rm ubuntu:latest //删除
volume
//挂载
docker container run --it --mount type=bind,src=/home/shiyanlou,target=/home/shiyanlou --name xxx --rm ubuntu /bin/bash
文件写入的时候出现权限问题:
当时开了两个终端,要在容器内开权限才行:
network
docker container -aq | xargs docker container rm//删除容器
docker container -q | xargs docker container stop//停止容器
docker network ls
docker network inspect bridge //查看桥接信息
sudo iptables -t nat -nvL //查看iptables 中nat表和filyer表
docker network connect network1 shiyanlou01 //连接到network1网络中
docker network run -it --network host/none --rm busybox /bin/sh // 指定网络
Dockerfile创建镜像
//指定基础镜像
FROM ubuntu:14.04
//安装软件 //-y是同意
RUN apt-get update && apt-get install -y openssh-server && mkdir /var/run/sshd
//添加用户 // -g:指定用户所属的群组. -G:指定用户所属的附加群组
RUN useradd -g root -G sudo shiyanlou && echo "shiyanlou:123456" | chpasswd shiyanlou
//暴露端口,将该端口暴露出来,允许外部或其它的容器进行访问
EXPOSE 22
//执行 //openssh的服务端:sshd
CMD ["/usr/sbin/sshd","-D"]
docker运行Redis
dockerfile 安装
redis dockerfile:
# Version 0.1
# 基础镜像
FROM ubuntu:14.04
# 维护者信息
MAINTAINER shiyanlou@shiyanlou.com
# 镜像操作命令
RUN echo "deb http://mirrors.cloud.aliyuncs.com/ubuntu/ trusty main universe" > /etc/apt/sources.list
RUN apt-get -yqq update && apt-get install -yqq supervisor redis-server
RUN apt-get install -yqq openssh-server openssh-client
RUN mkdir /var/run/sshd
RUN echo 'root:shiyanlou' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
EXPOSE 6379 22
# 容器启动命令
CMD ["supervisord"]
创建文件supervisord.conf
添加:
[supervisord]
nodaemon=true
[program:redis]
command=/usr/bin/redis-server
[program:ssh]
command=/usr/sbin/sshd -D
创建Redis镜像
docker image build -t xxx:0.1 . //-t 指定镜像名称
docker image ls //查看
由该镜像创建新容器redis
docker run -P -d --name redis xxx:0.1
docker container ls //查看
ssh root@127.0.0.1 -p ports //连接redis容器中ssh和redis服务
sudo apt-get install -y redis-server redis-cli -h 127.0.0.1 -p ports //访问redis服务
运行Wordpress
mkdir目录 目录下创建三个文件:
Dockerfile,nginx-config,supervisord.conf
Dockerfile:
# Version 0.1
FROM ubuntu:14.04
LABEL maintainer=" "
// Dockerfile 创建了一个简单的镜像,使用 Supervisord 启动服务
RUN echo "deb http://mirrors.cloud.aliyuncs.com/ubuntu/ trusty main universe" > /etc/apt/sources.list
RUN apt-get -yqq update
RUN apt-get -yqq install nginx supervisor wget php5-fpm php5-mysql
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
//安装wordpress
RUN mkdir -p /var/www
ADD https://labfile.oss-cn-hangzhou-internal.aliyuncs.com/courses/498/wordpress-4.4.2.tar.gz /var/www/wordpress-4.4.2.tar.gz
RUN cd /var/www && tar zxvf wordpress-4.4.2.tar.gz && rm -rf wordpress-4.4.2.tar.gz
RUN chown -R www-data:www-data /var/www/wordpress
//安装ssh服务
RUN mkdir /var/run/sshd
RUN apt-get install -yqq openssh-server openssh-client
RUN echo 'root:xxx' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
//安装mysql
RUN echo "mysql-server mysql-server/root_password password xxx" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password xxx" | debconf-set-selections
RUN apt-get install -yqq mysql-server mysql-client
EXPOSE 80 22 //开放端口80-web,22-ssh
COPY nginx-config /etc/nginx/sites-available/default
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN service mysql start && mysql -uroot -pxxx -e "create database wordpress;" // 安装wordpress所需的数据库
RUN sed -i 's/database_name_here/wordpress/g' /var/www/wordpress/wp-config-sample.php
RUN sed -i 's/username_here/root/g' /var/www/wordpress/wp-config-sample.php
RUN sed -i 's/password_here/xxx/g' /var/www/wordpress/wp-config-sample.php
RUN mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
CMD ["/usr/bin/supervisord"] //启动
nginx-config:
server {
listen *:80;
server_name localhost;
root /var/www/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php{
try_files $uri =404;
include fastcgi_params;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
}
supervisord.conf:
[supervisord]
nodaemon=true
[program:php5-fpm]
command=/usr/sbin/php5-fpm -c /etc/php5/fpm
autorstart=true
[program:mysqld]
command=/usr/bin/mysqld_safe
[program:nginx]
command=/usr/sbin/nginx
autorstart=true
[program:ssh]
command=/usr/sbin/sshd -D
//创建镜像
docker build -t xxxwordpress:0.1 .
//查看镜像
docker image ls
//利用镜像创建容器wordpress 并映射本地的80端口到容器80端口
docker run -d -p 80:80 --name wordpress xxxwordpress:0.1
//success后就可以查看容器
docker container ls
然后本地地址访问xxxx/wp-admin/install.php 就会出现Wordpress网站安装界面
docker API
管理容器
curl http://127.0.0.1:2375/info | python -mjson.tool // 查看,对输出信息进行美化
curl http://127.0.0.1:2375/containers/json\?all\=1\&limit\=1\&size\=1 // 查找容器,all所有的容器,limit显示最后创建的一个,size返回容器的大小
curl -X POST -H "Content-Type: application/json" \
http://127.0.0.1:2375/containers/create?name=test_nginx \
-d '{"Image":"nginx","HostConfig": {"Binds": ["/home/shiyanlou/data:/data"],"PortBindings": {"80/tcp": [{"HostPort":"81"}]}
}
}' //创建nginx容器,注意ID
//访问 localhost:81
curl -X DELETE http://127.0.0.1:2375/containers/id\?force\=1 //删除指定容器
管理镜像
curl http://127.0.0.1:2375/images/json | python -mjson.tool //查看所有镜像
POST /images/create\?fromImage //拉取镜像
DELETE /images/(name) //删除镜像
管理数据卷
POST /volumes/create -d //创建
curl http://127.0.0.1:2375/volumes | python -mjson.tool //查看
DELETE /volumes/(name) //删除
管理网络
curl http://127.0.0.1:2375/networks | python -mjson.tool //查看
POST /networks/create -d //创建
POST /networks/name/connect -d '{"Container":"id"}' //连接容器到网络
DELETE /networks/(id) //删除
API 开发应用
配置远程访问
sudo vi /etc/default/docker //修改配置文件
DOCKER_OPTS="-H=tcp://0.0.0.0:2375 -H=unix:///var/run/docker.sock"
//在文末添加,-H=tcp://0.0.0.0:2375表示将 Docker 守护进程(daemon)监听到所有的网络接口的 2375 端口上,-H=unix:///var/run/docker.sock 是允许本地访问连接。
docker 手动配置生效
sudo vi /lib/systemd/system/docker.service
将
ExecStart=...
ExecReload=...
改为
EnvironmentFile=-/etc/default/docker
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
//生效
sudo systemctl daemon-reload
sudo service docker restart
//测试
docker -H localhost:2375 info //information
配置虚拟环境
sudo pip install virtualenv
virtualenv -p /usr/bin/python3.5 venv //使用 python3.5 ,venv 为虚拟环境目录名
source venv/bin/activate //激活
在虚拟环境中安装ipython和docker
pip3 install ipython
pip3 install docker
啥啥啥之前都必须实例化否则无法识别client,以下在ipython
import docker
client = docker.DockerClient(base_url='tcp://127.0.0.1:2375')
client.containers.list()
client
//用python实现启动nginx容器,若没有容器提前pull
container = client.containers.run(name='syl_nginx', image='nginx:latest', volumes={ '/home/shiyanlou/data': {'bind': '/data', 'mode': 'rw'}}, ports={'80/tcp': 84}, detach=True) //detach 后台启动容器
container.logs()
然后访问localhost:84
列出所有镜像,containers同理
client.iamges.list()
获取容器信息,redis若是没有记得pull
c1 = client.containers.run(image='redis', detach=True)
c2 = client.containers.create(image='nginx',volumes={'/home/shiyanlou/data': {'bind': '/data', 'mode': 'rw'}}, ports={'80/tcp': 85})
c2.start() //启动
results = {} //results 字典作为返回信息的存储,获得容器的各种属性
container_list = client.containers.list()
for container in container_list:
results['short_id'] = container.short_id
results['image'] = container.image
results['top'] = container.top()
results['stats'] = container.stats()
results
使用Dockerfile创建镜像,需要调用 client.images.build() 方法
建立 build-image.py :
import sys
import os
import docker
client = docker.DockerClient(base_url='tcp://127.0.0.1:2375') //初始化client
if len(sys.argv) != 3: //是否输入了两个参数,读取第一个参数判断是否为路径并且路径下存在 Dockerfile
print("Parameter ERROR:args number")
sys.exit()
if os.path.isdir(sys.argv[1]): //如果存在则创建镜像,如果不存在,就返回错误信息
dockerFile = os.path.join(sys.argv[1], 'Dockerfile')
if os.path.exists(dockerFile):
image = client.images.build(path=sys.argv[1], tag=sys.argv[2])
print(image)
print(client.images.list())
else:
print("build error,not found Dockerfile")
创建Dockerfile:
FROM ubuntu:14.04
ENV HOSTNAME=shiyanlou //ENV用来定义环境变量
回到目录下
python build-image.py /home/shiyanlou/imagetest build_test //从Dockerfile构建容器
docker image ls //查看最终创建的镜像