2018.5.3 docker

# docker
[TOC]
## docker概念
概念官网解释:[docker官网](https://www.docker.com/)

 1. 开放平台
 2. 容器技术
 3. LXC(Linux Container)
### 组成
 1. Docker Engine:运行平台,构建镜像(核心概念:Docker镜像 image,Docker容器 containers,docker Registry)
 ![Docker容器 ](http://img.blog.csdn.net/20171109095551860?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU3RlcGhlbkx1MDQyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
 2. Docker Registry:托管镜像的仓库
 3. Docker Hub:托管存储和共享镜像
 4. Docker Machine:构建容器运行环境的配置
 5. Docker Compose:多容器应用管理
 6. Docker Swarm:容器集群和调度管理工具
 7. Kitematic:桌面GUI管理程序(测试过Windows,体验还行)
 8. Docker Toolbox(替代Boot2Docker)
 9. Docker Trusted Registry(DTR)
 10. Docker Subscription
 
### 架构
![docker-egine架构图](http://img.blog.csdn.net/20171109093859700?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU3RlcGhlbkx1MDQyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)


### 生态
---
## docker命令
---
## docker 网络(略)

```
ip link add veth-a type veth peer name veth-b
ip a |grep veth
brctl addif br0 veth-a
ip link set veth-a up
ip link set veth-b netns test1

...
```
---
## 实战
### 安装
centos
```
yum install docker
```
ubuntu
```
apt install docker.io
```
启动
```
service docker start

或者
systemctl start docker.service
```
设置开机启动
```
chkconfig docker on
或者
systemctl enable docker.service
```
### docker 命令
#### 查看
```
docker info
```
#### run 
-i(stdin) -t(stdout) -d(后台运行) --rm (执行exit命令后就会退出删除容器,相当于运行一个临时的容器)
```
docker run -it centos /bin/bash

docker run --name haha -it centos /bin/bash
docker start haha
docker ps
#附着
docker attach haha
#执行shell脚本“while”循环
docker run --name daemon_haha -d centos /bin/bash -c "while true;do echo hello world;sleep 1;done"
#查看日志:-t加时间戳-f监控
docker logs -t -F daemon_haha

docker logs --tail 2 -t daemon_haha

# 查看容器对应宿主机的目录对应container id
cd /var/lib/docker/containers
docker ps -a
##到对应的容器id目录下即可查看日志文件

docker top daemon_haha

```
#### exec (开启交互模式)
```
docker exec -i -t daemon_haha /bin/bash
docker ps
# 退出还会在后台运行,相当于只是将/bin/bash进程退出而已
 exit
docker ps

#存在创建的txt文件
docker exec -d daemon_haha touch /etc/docker.txt
docker exec -it daemon_haha /bin/bash
 ll /etc/

```
#### ps(查看正在运行的容器) -a(包括停止的容器)
```
docker ps -l
docker ps -a
docker ps -n 2

```

#### stop(停止后台运行)
```
docker stop daemon_haha
docker ps
docker start daemon_haha
docker ps
```
#### kill(不建议)
```
docker kill daemon_haha
```
#### inspect(查看容器信息)
```
#看容器的属性,hostnamepath主机名的路径,容器的id,镜像的id
docker inspect daemon_haha
docker inspect --format='{{.State.Running}}' daemon_haha
```
#### rm(删除容器)
```
docker rm haha
docker ps -a -q
docker rm `docker ps -a -q`
docker rm -f `docker ps -a -q`
#正在运行的需要停止或者强制删除-f
docker rm -f `docker ps -a -q`
#或者
docker rm -f $(docker ps -a |awk '{print $1}')
```
#### save(保存)
```
docker save [images_tag]> test.tar
```
#### load(导入)
```
docker load test.tar
```
#### export(备份)
```
docker ps -a 
docker export [docker id] > my_container.tar
cat my_container.tar | docker import - container:test
docker images
docker run -it container:test /bin/bash
```
#### import
docker import [container_name]
#### search
```
docker search centos

```
#### commit 
```
docker commit [container id ] haha/test
```
---
#### build
docker build从客户端传输到docker守护进程,构建是在守护进程里面进行的
Dockerfile所在的目录就是构建目录,将文件发给守护进程
```
Dockerfile
 
 FROM centos
 MAINTAINER ruofei
 RUN mkdir /usr/local/test
 EXPOSE 80
```
```
docker build --no-cache -t="haha/no-cache".
docker images

docker build -t "haha/use-cache" .
```
#### history
查看镜像构建过程
```
docker history haha/use-cache
```
### Dockerfile
#####ENV
环境变量的设置,设置完,启动容器后使用env命令查看:

```
env

#输出例子
HOSTNAME=b123876429ce
OLDPWD=/opt/spark-1.6.0-bin-hadoop2.6/bin
PYTHON_VERSION=2.7.5
```
也可以使用docker -e “<key>:<value>”传入环境变量
##### WORKDIR
工作目录,类似cd命令去到工作的目录下面
##### CMD & ENTRYPOINT
CMD:容器运行时指定运行命令,可被用户覆盖;ENTRYPOINT:容器启动时指定默认运行命令,不可被用户指定参数被覆盖,多个ENTRYPOINT,最后一个成立。
##### ARG
指定参数让用户docker build --build-arg 将参数传入
```
如果ARG指定了一个默认值并且在构建期间没有传递值过去,那么就使用默认值。
ARG变量定义从在Dockerfile定义的行生效,而不是从在命令行参数的使用或其它地方。
```
```
FROM busybox
USER ${user:-some_user}
ARG user
USER $user
...
```
使用如下命令构建:

```
docker build --build-arg user=haha_user -f path_Dockerfile
```
ps:第一个传入的user值为-some_user,后面被用户传入的haha_user覆盖了。注意不要传入秘钥等隐私数据,因为可以通过docker history查看
### 集群
#### web
1.
(1)先构建JDK镜像
在当前目录(/root/jdk) 
```Dockerfile
FROM centos
MAINTAINER StephenLu
ADD jdk-7u75-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
ENV JAVA_HOME /usr/local/jdk1.7
ENV JRE_HOME /usr/java/jdk1.7/jre
ENV CLASSPATH .:$JAVA_HOME/jre/lib/rt.jar  :$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH

```
(2)将JDK拷贝过来当前目录
```
cp ../jdk-7u75-linux-x64.tar.gz .
```
(3)创建镜像
```
docker build –t=”hadoop/jdk” .
docker run --rm -it [image_id]
 ls /usr/local
```
2.
Dockerfile
```
FROM hadoop/jdk
MAINTAINER StephenLu
ADD appache-tomcat-7.0.62.tar.gz /usr/local
WORKDIR /usr/local
RUN mv apache-tomcat-7.0.62 tomcat7
WORKDIR /usr/local/tomcat7/bin
EXPOSE 8080
```
(2)
```
docker run --rm -ti 0a2fb0c55cea
```
(3)
```
docker run --rm -P -it 0a2fb0c55cea /bin/bash
 ./startup.sh
#测试 
docker ps
curl -XGET '192.168.66.217:007'


# ./startup.sh在后台运行,docker以为容器内没运行进程就停调了
docker run –d –P hadop/tocat ./startup.sh

# 使用调试模式启动tomcat
docker run –d –P hadoop/tomcat ./catalina.sh run 
docker ps -l

# 动态指定volume
docker run -d -P -v /usr/local/yf_test:/usr/local/tomcat7/webapp -p 8080:8080 hadoop/tomcat ./catalina.sh run
docker ps
# 页面访问
ip:port/haha/a.txt

```
#### Redis
1.单机
Dockerfile
```

```
2.集群
#### spark
#### hadoop
#### tensorflow
使用docker-compose
0.安装docker-compose
```
pip install docker-compose
```
1.创建yml文件docker-compose.yml
```
version: '2'
services:
  jupyter:
    image: registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow:1.0.0
    ports:
      - "8888:8888"
    volumes:
      - "/tmp/tensorflow_logs"
      - "./notebooks:/root/notebooks"
    command:
      - "/run_jupyter.sh"
      - "/root/notebooks"
  tensorboard:
    image: registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow:1.0.0
    ports:
      - "6006:6006"
    volumes_from:
      - jupyter
    command:
      - "tensorboard"
      - "--logdir"
      - "/tmp/tensorflow_logs"
      - "--host"
      - "0.0.0.0"
```
2.启动运行环境
```
docker-compose up -d
```
3.检查
```
docker-compose ps
```
4.使用环境
 http://127.0.0.1:8888/tree 
 
### 大礼包!!!

#### 深度学习套装
获取镜像
```
docker pull floydhub/dl-docker:cpu
```
运行
```
docker run -it -p 8888:8888 -p 6006:6006 floydhub/dl-docker:cpu jupyter notebook

(docker run -it -p 8888:8888 -p 6006:6006 floydhub/dl-docker:cpu tensorboard --logdir /tmp/tensorflow_logs --host 0.0.0.0)

#检查,浏览器登录0.0.0.0:8888,查看jupyter notbook;0.0.0.0:6006,查看tensorbo
docker run -it -p 8888:8888 -p 6006:6006 -v /sharedfolder:/root/sharedfolder floydhub/dl-docker:cpu bash

```
查看版本
```
import tensorflow as tf
import keras
tf.__version__
#0.8.0
print keras.__version__
#1.0.3
th.__version__
#0.8.2
caffe.__version__
#'1.0.0-rc3'


```

---
特别感谢大神工程师们的博客带我入门
###参考
>1.[10张图带你深入理解Docker容器和镜像](http://dockone.io/article/783),2015
>2.[docker官网](https://www.docker.com/)
>3.基于Docker的Tensorflow实验环境-博客-云栖社区-阿里云
>4.[Ubuntu16.04安装Docker1.12+开发实例+hello world+web应用容器](http://blog.csdn.net/dream_an/article/details/51985170)
>5.[包含深度学习常用框架的Docker环境](http://blog.csdn.net/lijingpengchina/article/details/53039065),2016
>6.http://tshare365.com/archives/2077.html
>7.[github:dl-docke](https://github.com/lijingpeng/dl-docker)
>8.[Docker+Jenkins_自动化持续集成](https://www.cnblogs.com/RedHat-Linux/p/6929441.html)
>9.[Dockerfile参考(15) – ARG指令定义由用户在命令行赋值的变量](https://www.centos.bz/2016/12/dockerfile-arg-instruction/)
>10.[Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较](https://www.cnblogs.com/lienhua34/p/5170335.html)

猜你喜欢

转载自www.cnblogs.com/fast-walking/p/8984605.html