实体机 -> 虚拟化 -> 容器
安装依赖
1
2
3
4
5
|
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
|
配置key\添加仓库
1
2
3
4
5
6
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt-get update
|
安装
1
|
sudo apt-get install docker-ce
|
1
2
3
4
5
|
sudo pacman -S docker
sudo systemctl start docker
sudo docker info
docker run hello-world
sudo systemctl enable docker
|
- Build from Dockefile
- pull from Registry
docker pull ubuntu:14.04
1
2
3
4
5
6
7
8
9
10
|
gcc -static main.c -o hello
vi Dockerfile
1 FROM scratch
2 ADD hello /
3 CMD ["/hello"]
docker build -t xuehu96/helloworld .
docker history f1e0ec3b99c3 # 查看构建目录
|
通过image创建 Container Layer(R/W)
docker container ls
docker container ls -a 列出已经退出的
- 交互式运行
docker run -it centos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
docker ps -a #docker container ls -a
docker rm CONTAINER_ID # 删除容器
docker images # docker image ls
docker images rm ID
docker rmi ID # 删除image
docker container ls -aq #列出所有container ID
docker rm $(docker container ls -aq)
# 清理已经退出的container
docker rm $(docker container ls -f "status=exited" -q)
|
Create a new image from a container's changes
docker commit great_galileo xuehu96/centos-vim
docker iamge rm 277e69564171 # 删掉创建的image
Build an image from a Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
|
vi Dockerfile
FROM centos
RUN yum install -y vim
➜ docker-centos-vim ls
Dockerfile
➜ docker-centos-vim docker build -t xuehu96/centos-vim-new .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos
---> 0f3e07c0138f
Step 2/2 : RUN yum install -y vim
---> Running in c94ca4bc3701
|
- FROM
- FROM scratch
- FROM centos
- ubuntu:14.04
尽量使用官方的image作为baseimage
- LABEL
- LABEL maintainer="xuehu96@vip.qq.com"
- LABEL version="1.0"
- LABEL description="This is despcription"
- RUN
- WORKDIR 切换
- ADD and COPY add还可以解压缩
1
2
3
4
5
6
7
8
9
10
11
12
|
ADD hello /
Add test.tar.tz / #添加到根目录并解压
WORKDIR /root
ADD hello test/ #/root/test/hello
WORKDIR /root
COPY hello test/
# COPY优先于ADD
#添加远程文件、目录 用run wget或者curl
|
-
ENV
- ENV MYSQL_VERSION 5.6 #设置常量
- RUN apt-get install -y mysql-server="$(MYSQL_VERSION)"&& rm -rf /var/lib/apt/lists/*
-
VOLUME 存储
-
EXPOSE 网络
-
CMD
- 容器启动后默认执行的命令
- 如果docker run 指定了其他命令 cmd命令会被忽略
- 如果定义了多个CMD 只有最后一个会执行
-
ENTRYPOINT 设置容器启动时运行的命令
- 容器以应用程序或者服务执行
- 不会被忽略,一定会执行
1
2
3
4
5
6
7
|
# shell格式
RUN apt-get install -y vim
ENTRYPOINT echo "hello $name" # 变量
# Exec格式
RUN ["apt-get","install","-y","vim"]
ENTRYPOINT["/bin/echo","hello $name"] #输出的是hello $name
ENTRYPOINT["/bin/bash","-c","echo hello $name"] # 用bash执行
|
docker login
docker push name
1
2
3
4
5
6
7
8
9
10
|
docker run -d -p 5000:5000 --restart always --name registry registry:2
$ docker pull ubuntu
$ docker tag ubuntu localhost:5000/ubuntu
$ docker push localhost:5000/ubuntu
/etc/docker/deamon.json
{"insecure-registries":["localhost:5000"]}
/lib/systemd/system/docker.service
EnvironmentFile==-/etc/docker/daemon.json
|
1
2
3
4
5
6
7
|
mkdir flask-hello-world
vi Dockerfile
vi app.py
docker build -t xuehu96/flask-hello-world .
# -d 后台运行
docker run -d xuehu96/flask-hello-world:latest
|
Dockerfile
1
2
3
4
5
6
7
|
FROM python:2.7
LABEL maintainer="xuehu96"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","app.py"]
|
app.py
1
2
3
4
5
6
7
|
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello docker"
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)
|
1
2
3
4
5
6
7
8
|
docker exec -it ContainerID /bin/bash # 进入运行中的容器
docker container stop id # 停止容器
docker stop id
docker rm $(docker ps -aq) # 删掉退出状态的容器
docker inspect ID #查看详细的信息
|
1
2
3
4
|
FROM ubuntu
RUN apt-get update && apt-get install -y stress
ENTRYPOINT ["/usr/bin/stress"]
CMD [] # dockerrun 传递的参数
|
cpu memery
1
2
|
docker run --memory=200M ubuntu --vm 1 #内存
docker run --cpu-shares int # 权重
|
- 单机
- bridge network
- host network
- none network
- 多机
network namespace
1
2
3
4
5
6
7
|
➜ ~ ip netns add tesst 1
➜ ~ ip netns list
tesst
➜ ~ ip netns delete test1
ip netns exec tesst ip a
ip netns exec tesst ip link set dev lo up
|
1
2
3
4
5
6
7
8
9
|
sudo docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600;done"
sudo docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600;done"
docker exec -it test2 /bin/sh # test -> test1
ping test1 # 相当于DNS
docker stop test2 && docker rm test2
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
docker network create -d bridge my-bridge
docker network ls
brctl # 本地的br
sudo docker run -d --name test3 --network my-bridge busybox /bin/sh -c "while true; do sleep 3600;done"
docker network connect my-bridge test2
docker network inspect (docker network ls的id)
# 用户自定义的network 默认是相互link的 docker
|
1
2
3
4
5
|
docker run --name web -d nginx
docker stop web
docker remove web
docker run --name web -d -p 80:80 nginx # -p端口映射到本地
|
1
2
3
|
sudo docker run -d --name test1 --network host busybox /bin/sh -c "while true; do sleep 3600;done"
docker network inspect host
# 缺点 只能连接一个nginx
|
1
2
|
# 孤立的network namespace
sudo docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600;done"
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from flask import Flask
from redis import Redis
import os
import socket
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
|
1
2
3
4
5
6
7
|
FROM python:2.7
LABEL maintaner="xuehu96 xuehu96@vip.qq.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD [ "python", "app.py" ]
|
1
2
3
|
docker run -d --name redis redis
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis xuehu96/flask-redis
|
dockerfile:
VOLUME /var/lib/
1
2
3
4
5
6
7
8
|
docker volume ls
docker volume rm id
docker volume inspect id
#指定volume名字 -v mysql:/var/lib/mysql
sudo docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
sudo docker rm -f mysql1 #强制删除正在运行的容器
|
-v$(pwd):/data
- mysql
1
|
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
|
- wordpress
1
|
docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress
|
1
2
3
|
mkdir /data/mysql
docker run -d --privileged=true --name myMysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 33306:3306 mysql:5.6
docker run -d --name mwp -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_PASSWORD=123456 -p 1080:80 --link myMysql:mysql wordpress
|
多个image 多个container
docker-compose.yml
- Services
- Networks
- Volumes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
version: '3'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: mysql:3306
WORDPRESS_DB_PASSWORD: root
networks:
- my-bridge
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql
networks:
- my-bridge
volumes:
mysql-data:
networks:
my-bridge:
driver: bridge
|
1
2
3
4
5
6
7
8
9
10
|
docker-compose [-f docker-compose.yml] up
docker-compose -d up
docker-compose ps
#start
#stop 停止 down删除
docker-compose images
docker-compose exec mysql bash
docker-compose exec wordpress bash
|
docker-compose uo --scale web=3 -d