Docker安装与CLI

1.容器

实体机 -> 虚拟化 -> 容器

2.docker安装

安装依赖

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

Arch 安装

1
2
3
4
5
sudo pacman -S docker
sudo systemctl start docker
sudo docker info
docker run hello-world
sudo systemctl enable docker

image的获取

  1. Build from Dockefile
  2. pull from Registry
    docker pull ubuntu:14.04

创建一个docker image

 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 # 查看构建目录

Container

通过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)

docker container commit(docker commit)

Create a new image from a container's changes

docker commit great_galileo xuehu96/centos-vim

docker iamge rm 277e69564171 # 删掉创建的image

docker image build (docker build)

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

dockerfile

  • 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
    • yum update && \
  • WORKDIR 切换
    • WORKDIR /root
      尽量使用绝对目录
  • 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 image 发布

docker login

docker push name

私有registry

 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

python-flask

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)

docker container容器的操作

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 #查看详细的信息

dockerfile制作一个工具

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 # 权重

docker网络

  • 单机
    • bridge network
    • host network
    • none network
  • 多机
    • overlay 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

docker link(很少用) bridge network

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

新建network (bridge network)

 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

端口映射 port map

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端口映射到本地

host driver

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

none network

1
2
# 孤立的network namespace
sudo docker run -d --name test1 --network none busybox /bin/sh -c "while true; do sleep 3600;done"

python-flask-redis

 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

VXLAN

  • underlay
  • overlay

docker 持久化存储 数据共享

Volume -v

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 #强制删除正在运行的容器

mounting

-v$(pwd):/data

docker wordpress

  1. mysql
1
docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql 
  1. 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

docker compose

多个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

docker-compose

 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 scale

docker-compose uo --scale web=3 -d

updatedupdated2022-10-262022-10-26