docker 持续更新

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

文件写入的时候出现权限问题:


echo.JPG

当时开了两个终端,要在容器内开权限才行:


解决.JPG

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网站安装界面


wordp.JPG

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 //查看最终创建的镜像

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容