Docker 基础

List Docker CLI commands

1
2
docker
docker container --help

Display Docker version and info

1
2
3
docker --version
docker version
docker info

Execute Docker image

1
docker run hello-world

Image

List Docker images

1
docker image ls

Save and load image

Save

1
docker save -o dockerName.tar username/repository:tag

示例:

1
2
# save
docker save -o quay.io-calico-node-1.tar quay.io/calico/node:v1.0

Load

docker load -i dockerName.tar

1
2
# load
docker load -i quay.io-calico-node-1.tar

Export and import image

Export

docker export CONTAINER ID > imageName.tar

1
docker export 7691a814370e > ubuntu.tar

Import

  • 本地导入

    1
    
    cat imageName.tar | docker import  -  username/repository:tag

示例:

1
cat ubuntu.tar | docker import - test/ubuntu:v1.0
  • URL 导入

    1
    
    docker import http://example.com/exampleimage.tgz example/imagerepo

delete image

1
docker rmi <iamge>

Container

List Docker containers

running, all, all in quiet mode

1
2
3
docker container ls
docker container ls --all
docker container ls -aq

Build the app

创建docker 镜像,-t关联标签

1
docker build -t friendlyhello .

Run the app

-p 映射宿主机4000端口到容器80端口

-d 表示以守护方式打开(即非交互模式,后台运行)

-i 表示让容器的标准输入保持打开

-t 表示让Docker分配一个伪终端并绑定到容器的标准输入上

1
2
docker run -p 4000:80 friendlyhello
docker run -d -p 4000:80 friendlyhello

停止容器

1
docker container stop `CONTAINER ID`

Share your image

登录docker hub

1
docker login

Tag the iamge

1
2
docker tag image username/repository:tag
docker tag friendlyhello binbean/get-started:0.1

publish the image

1
2
docker push username/repository:tag
docker push binbean/get-started:0.1

命令总结

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
docker build -t friendlyhello .  # Create image using this directory's Dockerfile
docker run -p 4000:80 friendlyhello  # Run "friendlyhello" mapping port 4000 to 80
docker run -d -p 4000:80 friendlyhello         # Same thing, but in detached mode
docker container ls                                # List all running containers
docker container ls -a             # List all containers, even those not running
docker container stop <hash>           # Gracefully stop the specified container
docker container kill <hash>         # Force shutdown of the specified container
docker container rm <hash>        # Remove specified container from this machine
docker container rm $(docker container ls -a -q)         # Remove all containers
docker image ls -a                             # List all images on this machine
docker image rm <image id>            # Remove specified image from this machine
docker image rm $(docker image ls -a -q)   # Remove all images from this machine
docker login             # Log in this CLI session using your Docker credentials
docker tag <image> username/repository:tag  # Tag <image> for upload to registry
docker push username/repository:tag            # Upload tagged image to registry
docker run username/repository:tag                   # Run image from a registry

Service

Run app with load-balanced

1
2
docker swarm init
docker stack deploy -c docker-compose.yml getstartedlab

查看服务

1
docker service ls

Take down the app and the swarm

  • Take the app down with docker stack rm

    1
    
    docker stack rm getstartedlab
  • Take down the swarm

    1
    
    docker swarm leave --force

Swarm

配置swarm

run docker swarm init to enable swarm mode and make your current machine a swarm manager, then run docker swarm join on other machines to have them join the swarm as workers.

创建一个集群

  • 需要先安装virtualbox

    1
    2
    
    docker-machine create --driver virtualbox myvm1
    docker-machine create --driver virtualbox myvm2
  • 查看以创建的节点

    1
    
    docker-machine ls
  • 创建swarm管理节点

    1
    2
    3
    
    # 设置myvm1为管理节点
      
    docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
  • 加入worker 节点

    1
    2
    3
    4
    5
    
    # 把myvm2加入worker节点
      
    docker-machine ssh myvm2 "docker swarm join \
    --token <token> \
    <ip>:2377"
    1
    2
    3
    
    # 在管理节点上查看swarm节点情况
      
    docker-machine ssh myvm1 "docker node ls"
  • 上传docker-compost.yml文件到管理节点

    1
    
    docker-machine scp docker-compose.yml myvm1:~
  • 部署应用

    1
    
    docker-machine ssh myvm1 "docker stack deploy -c docker-compose.yml getstartedlap"
  • 查看应用运行情况

    1
    2
    
    docker-machine ssh myvm1 "docker stack ps getstartedlap"
    docker-machine ssh myvm1 "docker stack services getstartedlap"
  • 访问应用

可使用任意节点的IP地址访问应用,例如:http://192.168.99.101

关于docker-machine envand docker-machine ssh

docker-machine ssh

通过ssh与节点进行交互,命令包含在”“中,使用节点文件系统

1
docker-machine ssh <machine> "<command>"

docker-machine env

通过本地shell与远程节点交互,使用本机文件系统

1
docker-machine env <machine>

1) Mac or Linux

1
eval $(docker-machine env <machine>)

2) Windows

1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression
断开与远程节点链接,切换回本的shell

1) Mac or Linux

1
eval $(docker-machine env -u)

2) Windows

1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env -u | Invoke-Expression

命令总结

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# Create a VM (Mac, Win7, Linux)
docker-machine create --driver virtualbox myvm1 

docker-machine create --driver virtualbox --virtualbox-boot2docker-url https://github.com/boot2docker/boot2docker/releases/download/v18.06.1-ce/boot2docker.iso myvm2

# Win10
docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1 
# View basic information about your node
docker-machine env myvm1    
# List the nodes in your swarm
docker-machine ssh myvm1 "docker node ls"  
# Inspect a node
docker-machine ssh myvm1 "docker node inspect <node ID>"    
# View join token
docker-machine ssh myvm1 "docker swarm join-token -q worker"  
# Open an SSH session with the VM; type "exit" to end
docker-machine ssh myvm1
# View nodes in swarm (while logged on to manager)
docker node ls           
# Make the worker leave the swarm
docker-machine ssh myvm2 "docker swarm leave" 
# Make master leave, kill swarm
docker-machine ssh myvm1 "docker swarm leave -f" 
# list VMs, asterisk shows which VM this shell is talking to
docker-machine ls 
# Start a VM that is currently not running
docker-machine start myvm1  
# show environment variables and command for myvm1
docker-machine env myvm1    
# Mac command to connect shell to myvm1
eval $(docker-machine env myvm1)  
# Windows command to connect shell to myvm1
& "C:\Program Files\Docker\Docker\Resources\bin\docker-machine.exe" env myvm1 | Invoke-Expression   
# Deploy an app; command shell must be set to talk to manager (myvm1), uses local Compose file
docker stack deploy -c <file> <app>  
# Copy file to node's home dir (only required if you use ssh to connect to manager and deploy the app)
docker-machine scp docker-compose.yml myvm1:~
# Deploy an app using ssh (you must have first copied the Compose file to myvm1)
docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"   
# Disconnect shell from VMs, use native docker
eval $(docker-machine env -u)   
# Stop all running VMs
docker-machine stop $(docker-machine ls -q) 
# Delete all VMs and their disk images
docker-machine rm $(docker-machine ls -q) 

# List stacks or apps
docker stack ls    
# Run the specified Compose file
docker stack deploy -c <composefile> <appname>  
# List running services associated with an app
docker service ls      
# List tasks associated with an app
docker service ps <service>   
# Inspect task or container
docker inspect <task or container>    
# List container IDs
docker container ls -q   
# Tear down an application
docker stack rm <appname> 
# Take down a single node swarm from the manager
docker swarm leave --force