Docker常用命令

查看docker版本

1
2
3
4
docker  --version
docker-compose --version
docker-machine --version
docker info

docker常用命令

1
2
3
4
docker search <image>
docker pull imagename
docker images
docker ps -a

运行nginx服务器

1
docker run -d -p 80:80 --name webserver nginx

停止服务器

1
docker stop webserver

删除服务器

1
docker rm webserver

docker命令

Docker简介

依赖于linux的cgroups和namespace

1
docker run -i -t ubuntu /bin/bash

Docker的基本组成

Docker Client/Docker Daemon

C/S架构

本地/远程

Docker Image

容器的基石(源代码)

层叠的只读文件系统

联合加载(union mount)

— 可写层

— add Apache

— add emacs

— rootfs(Ubuntu) <————基础镜像

— bootfs

Docker Container

通过镜像启动

启动和执行阶段

写时复用(copy on write)

Docker Registry

公有和私有

从DockerHub上下载

常用命令

1
2
3
4
5
6
7
8
9
10
11
docker version
docker search imagename
docker pull imagename
docker run imagename echo 'hello world'
docker ps
docker run learn/tutorial apt-get install -y ping
docker commit containerid learn/ping 修改镜像
docker run learn/ping ping www.baidu.com
docker inspect containerid 查看容器信息
docker images
docker push learn/ping 保存到dockerhub中

Docker容器相关技术简介

Namespaces命令空间

系统资源的隔离(包括进程、网络、文件系统)

(1)PID(Process ID) 进程隔离

(2)NET(Network) 管理网络隔离

(3)IPC 管理跨进程通信的访问

(4)MNT(Mount) 管理挂载点

(5)UTS(Unix Timesharing System) 隔离内核和版本标识

Cgroups 控制组

用来分配资源

来源于Google

(1)资源限制

(2)优先级限制

(3)资源计量

(4)资源控制

Docker容器的能力

(1)文件系统的隔离:每个容器都有自己的root文件系统

(2)进程隔离:每个容器都运行在自己的进程环境中

(3)网络隔离:容器间的虚拟网络接口和IP地址都是分开的

(4)资源隔离和分组:使用cgroup将cpu和内存之类的资源独立分配给每个Docker容器

Docker在Ubuntu中的安装

检查内核版本

1
uname -a

检查Device Mapper

1
ls -l /sys/class/misc/device-mapper

(1)ubuntu维护的docker版本安装

1
2
sudo apt-get install -y docker.io
source /etc/bash_completion.d/docker.io

(2)安装Docker维护的版本

1
2
sudo apt-get install -y curl
curl -sSL https://get.docker.com/ubuntu/ | sudo sh

使用非root用户

1
2
3
sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart

Docker的客户端和守护进程

Remote API

Restful风格API

STDIN、STDOUT、STDERROR

Docker官方的Remote API Reference:

https://docs.docker.com/reference/api/docker_remote_api/

连接方式(Socket连接)

1
2
3
unix:///var/run/docker.sock(默认的连接方式)
tcp://host:port
fd://socketfd
1
ps -ef | grep docker

Remote API example:

1
nc -U /var/run/docker/docker.sock

Docker的远程访问

修改docker配置(vim /etc/default/docker)

1
sudo service docker restart

客户端的远程访问

1
2
curl http://10.211.55.5:2375/info
docker -H tcp://10.211.55.5:2375 info

Docker_HOST环境变量

Docker守护进程的配置和操作

1
2
3
4
ps -ef | grep docker
sudo service docker stop
sudo service docker start
sudo service docker restart

以守护的形式运行docker

docker -d [OPTIONS]

运行相关:

-D,–debug=false

-e,–exec-driver=”native”

-g,–graph=”/var/lib/docker”

–icc=true

-l,–log-level=”info”

–label=[]

-p,–pidfile=”/var/run/docker.pid”

Docker服务器连接相关:

-G,–group=”docker”

-H,–host=[]

–tls=false

–tlscacert=”/home/sven/.docker/ca.pem”

–tlscert=”/home/sven/.docker/cert.pem”

–tlskey=”/home/sven/.docker/key.pem”

–tlsverify=false

RemoteAPI相关:

–api-enable-cors=false

存储相关:

-s,–storage-driver=””

–selinux-enabled=false

–storage-opt=[]

Registry相关:

–insecure-registry=[]

–registry-mirror=[]

网络设置相关:

-b,–bridge=””

–bip=””

–fixed-cidr=””

–fixed-cidr-v6=””

–dns=[]

–dns-search=[]

–ip=0.0.0.0

–ip-forward=true

–ip-masq=true

–iptables=true

–ipv6=false

–mtu=0

Docker Command Line Reference:

https://docs.docker.com/reference/commandline/cli

启动配置文件

/etc/default/docker

DOCKER_OPTS =

容器的基本操作

启动容器:

1
docker run image [command] [arg]

启动交互式容器:

1
docker run -i -t image /bin/bash

-i –interactive=true|false 默认是false

-t –tty=true|false 默认是false

查看容器

-a 列出所有的容器 -l列出最新创建的容器

1
docker ps [-a] [-l] 

查看运行的容器

1
docker ps  

查看所有的容器

1
docker ps -a 

查看最近运行的容器

1
2
docker ps -l 
docker insepct containerId or containerName

Docker自定义容器名

1
docker run --name=test -i -t ubuntu /bin/bash

重新启动已经停止的容器:

1
docker start [-i] 容器名

删除已经停止的容器

1
docker rm containerId

Docker守护式容器

1
docker run -i -t image /bin/bash

Ctrl+P Ctrl+Q

重新进入容器

1
docker attach containerId

启动守护式容器

1
docker run --name dc1 -d ubuntu /bin/sh "while true;do echo hello world; sleep 1;done"

容器日志:

docker logs [-f] [-t] [–tail] 容器名

-f –follows=true|false 默认为false

-t –timestamps=true|false 默认为false

–tail=”all”

查看容器内的进程:

1
docker top containerId or containerName

在运行的容器内启动新进程

1
2
docker exec [-d] [-i] [-t] 容器名  [command] [arg...] 785d8f10f6ad
docker exec -i -t test01 /bin/bash

停止守护式容器

发送信号,等待容器停止

1
docker stop 容器名

直接停止容器

1
docker kill 容器名

在容器中部署静态网站

设置容器的端口映射

run [-P] [-p]

-P,–publish-all=true|false 默认为false 暴露所有的端口

docker run -P -i -t ubuntu /bin/bash

-p,–publish=[]

containerPort

​ docker run -p 80 -i -t ubunbu /bin/bash

hostPort:containerPort

​ docker run -p 8080:80 -i -t ubuntu /bin/bash

ip:containerPort

​ docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash

ip:hostPort:containerPort

​ docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash

Nginx部署流程

1.创建映射80端口的交互式容器

1
docker run -p 80 --name web -i -t ubuntu /bin/bash

2.安装Nginx

1
apt-get install -y nginx

3.安装文本编辑器vim

1
apt-get install -y vim 

4.创建静态页面

1
2
3
4
5
mkdir -p /var/www/html

cd /var/www/html

vim index.html

5.修改nginx配置文件

1
2
3
4
5
6
7
whereis nginx

ls /etc/nginx/sites-enabled

vim /etc/nginx/sites-enabled/default

root /var/www/html;

6.运行nginx

1
2
3
nginx 

ps -ef

7.验证网站访问

查看端口的映射情况

1
docker port web

80/tcp -> 0.0.0.0:49167

查看容器中进程的运行情况

1
docker top web

查看容器的ip地址

1
2
3
docker inspect web
docker exec web nginx
docker top web

查看和删除镜像

1
2
3
docker info
sudo ls -l /var/lib/docker/aufs
sudo ls -l /var/lib/docker/aufs/mnt

docker images:

-a,–all=false

-f,–filter=[]

–no-trunc=false 指定不使用截断的形式

-q,–quiet=false 只显示镜像的唯一id

1
2
docker inspect container/image
docker rmi image:

-f,–force=false Force removal of the image

–no-prune=false Do not delete untagged parents

删除所有的镜像

1
docker rmi $(docker images -q)

构建镜像

保存对容器的修改,再次使用

自定义镜像的能力

以软件的形式打包并分发服务及其运行环境

docker commit 通过容器构建

docker build 通过dockefile文件构建镜像

docker commit [OPTIONS] containner[repository[:TAG]]

-a,–author=”” Author

eg “xxx@xxx.com

-m,–message=”” commit message

-p,–pause=true Pause container during commit

eg:

(1)docker run -it -p 80 –name commit_test ubuntu /bin/bash

(2)apt-get nginx

(3)docker commit commit_test -a “test” -m “test” dormancypress/commit_test1

(4)docker images

(5)docker run -d –name nginx_web1 -p 80 dormancypress/commit_test1 nginx -g “daemon off;”

创建dockerfile

##First Dockerfile

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

RUN apt-get update

RUN apt-get install -y nginx

EXPOSE 80

mkdir -p dockerfile/df_test1

cd dockerfile/df_test1

vim Dockerfile

docker build [OPTIONS] PATH | URL | -

–force-rm=false

–no-cache=false

–pull=false

-q,–quiet=false

–rm=true

-t,–tag=””

docker build -t=’dormancypress/df_test1’ .

获取和推送镜像

查找镜像

Docker Hub:

https://registry.hub.docker.com

docker search [OPTIONS] TERM

–automated=false Only show automated builds

–no-trunc=false Don’t truncate output

-s,–stars=0 Only displays with at least X stars

拉取鏡像

docker pull

使用–registry-mirror选项加速下载

(1)修改:/etc/default/docker

(2)添加:DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR

https://www.daocloud.io

vim /etc/default/docker

DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR

sudo service docker restart

ps -ef | grep docker

docker push dormancypress/nginx

Docker指令

指令格式

(1)# Comment 注释

(2)INSTRUCTION argument 指令

基础镜像,必须是dockerfile中第一条指令

FROM

FROM :

制定镜像的作者信息, 包含镜像的所有者和联系信息

MAINTAINER

指定当前镜像中运行的命令(构建时运行)

RUN (shell指令)

/bin/sh -c command

RUN echo hello

RUN [“executable”,”param1”,”param2”] (exec模式)

RUN[“/bin/bash”,”-c”,”echo hello”]

指定运行该镜像的容器使用的端口

EXPOSE […]

CMD(运行时运行)(会被docker run中指定的启动命令覆盖)

CMD“executable”,”param1”,”param2”

CMD command param1 param2 (shell模式)

CMD[“param1”,”param2”] (作为ENTRYPOINT指令的默认参数)

不会被docker run中指定的启动命令覆盖(可以使用docker run –entrypoint覆盖)

ENTRYPOINT“executable”,”param1”,”param2”

ENTRYPOINT command param1 param2(shell模式)

CMD和ENTRYPOINT组合使用

docker run -p 80 -d –name ep_test2 dormancypress/df_test5 -g “daemon off;”

ADD包含类似tar的解压功能

ADD

ADD “…”

如果单纯复制文件,Docker推荐使用COPY

COPY

COPY [““…”“] (适用于文件路径中有空格的情况)

———————-dockerfile——————————–

##first dockerfile for test

FROM ubuntu:14.04

MAINTAINER dormancypress “xxxx@xxxx.com

RUN apt-get update

RUN apt-get install -y nginx

COPY index.html /usr/share/nginx/html/

EXPOSE 80

ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]

添加卷

VOLUME [“/data”]

从镜像创建一个新容器时,在容器内部设置工作目录。也可以在构建中,为后续的工作指定工作目录

需要注意:通常使用绝对路径,如果使用相对路径,通常路径会传递下去

WORKDIR /path/to/workdir

用来设置环境变量

ENV

ENV =

指定镜像会以什么样的用户运行

USER daemon

USER user USER uid

USER user:group USER uid:gid

USER user:gid USER uid:group

为镜像添加触发器

当一个镜像被其他镜像作为基础镜像时执行

会在构建过程中插入指令

ONBUILD [INSTRUCTION]

—————-dockerfile—————–

#first dockerfile for test

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

RUN apt-get update

RUN apt-get install -y nginx

ONBUILD COPY index.html /usr/share/nginx/html/

EXPOSE 80

ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]

Dockerfile的构建过程

(1)从基础镜像运行一个容器

(2)执行一条指令,对容器做出修改

(3)执行类似docker commit的操作,提交一个新的镜像层

(4)再基于刚提交的镜像运行一个新容器

(5)执行dockerfile中的下一条指令,直至所有指令执行完毕

构建缓存

不使用构建缓存 docker build –no-cache

——————–dockerfile—————-

FROM ubuntu:14.04

MAINTAINER dormancypress “xxx@xxx.com

ENV REFRESH_DATE 2015-04-01

RUN apt-get update

RUN apt-get install -y nginx

EXPOSE 80

查看镜像的构建过程

docker history image

Docker容器的网络基础

ifconfig 查看网络配置

sudo apt-get install bridge-utils 网桥管理工具

sudo brctl show

修改docker0地址:

sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

添加虚拟网桥

sudo brctl addbr br0

sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

更改docker守护进程的启动配置

/etc/default/docker中添加DOCKER_OPS值

-b=br0

容器的互联

用于测试的Docker镜像Dockefile

FROM ubuntu:14.04

RUN apt-get install -y ping

RUN apt-get update

RUN apt-get install -y nginx

RUN apt-get install -y curl

EXPOSE 80

CMD /bin/bash

默认允许所有容器互联

–icc=true 默认

docker run -it –name cct1 dormancypress/cct

nginx

ctrl+p ctrl+q

docker run -it –name cct2 dormancypress/cct

ifconfig

使用代号,避免其他容器访问该容器时,由于容器重新启动产生的ip地址变化的问题

docker run –link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]

拒绝容器间互联

vim /etc/default/docker

DOCKER_OPTS = “–icc=true”

sudo service docker restart

允许特定容器间的连接

–icc=false –iptables=true

–link

sudo /etc/default/docker

DOCKER_OPTS =”–iptables=true,–icc=false”

sudo iptables -L -n

清空iptables的设置

sudo iptables -F

Docker容器与外部网络的连接

ip_forward

–ip-forward=true 决定系统是否会转发流量

sysctl net.ipv4.conf.all.forwarding

iptables

是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能

(1)表(table)

(2)链(chain)

(3)规则(rule)

ACCEPT REJECT DROP

filter表中包含的链:

INPUT

FORWARD

OUTPUT

sudo iptables -t filter -L -n

允许端口映射访问

docker run -it -p 80 –name cct5 dormancypress/cct

docker port cct5

限制ip访问容器

数据卷

数据卷是经过特殊设计的目录,可以绕过联合文件系统(ufs),为一个或多个容器提供访问

数据卷的特点

(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中、

(2)数据卷可以在容器之间共享和重用

(3)可以对数据卷里的内容直接进行修改

(4)数据卷的变化不会影响镜像的更新

(5)卷会一直存在,即使挂载数据卷的容器已经被删除

sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash

指定访问权限

sudo docker run -it -v ~/datavolume:/data:ro –name dvt1 ubuntu /bin/bash

使用Dockerfile构建包含数据卷的镜像:

VOLUME[“/data”]

# For data volume Test

FROM ubuntu:14.04

VOLUME [“/data/test”,”/data/test01”]

CMD /bin/bash

docker run -it –name dvt5 –volumes-from dvt4 ubuntu /bin/bash

数据卷的备份和还原

备份:

docker run –volumes-from [container name] -v $(pwd):/backup ubuntu

tar cvf /backup/backup.tar [container data volume]

docker restart dvt5

docker attach dvt5

启动容器进行备份

docker run –volumes-from dvt5 -v ~/backup:/backup –name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume

典型容器集群管理工具

(1)容器调度

Docker Swarm k8s Apache Mesos CoreOS Fleet Openstack Magnum

(2)配置管理(同步集群状态)

Etcd Zookeeper Consul

(3)服务发现

Etcd Haproxy Consul

(4)日志/监控/报警

ELK stack cAdvisor Prometheus

云集规模容器管理系统

(1)容器调度

(2)服务发现

(3)网络配置

(4)安全配置

(5)负载均衡

(6)数据持久化

(7)容错/高可用

(8)日志管理/容器监控

Docker Machine

一条命令,多环境部署

支持列表

VirtualBox Vmware Microsoft Hyper-V openstack Microsoft Azure RackSpace

Google Cloud Platform Amazon Web Services DigitalOcean

下载Docker machine

(1)curl -L https://github.com/docker/machine/releases/download/v0.4.0/dockder-machine_linux-amd64 > /user/local/bin/docker-machine

(2)chmod +x /user/local/bin/docker-machine

(3)docker-machine -V

(4)docker-machine create -d virtualbox test

(5)docker-machine ls

Docker machine命令集

start/stop/restart/kill

active/config/env/inspect/ip/status/url -获取Docker machine信息

ssh 远程登陆Docker Machine

scp 本机与Docker Machine或Docker Machine之间传输文件

(1)docker-machine env test

通过本机的Docker客户端连接远端的Docker Machine

(1)eval “$(docker-machine env test)”

(2)docker run -d -t index.alauda.cn/library/ubuntu bash

(3)docker ps

(4)docker-machine ssh test

Docker Compose

定义和运行多个Docker容器的工具

一个文件-docker-compose.yml

一条命令-docker-compose up

curl -L https://xxxx

docker-compose.yml

image:ubuntu:latest

build:/path/to/build/dir

dockerfile:使用指定的Dockerfile

command:覆盖默认命令

容器配置:

links:

-db:database

external_links:

-project_redis_1

ports:

-“3000”

-“8000:80”

expose:

- “3000”

volumes:

- /var/lib/mysql:/var/lib/mysql

environment:

- MYSQL_USER = mysql

docker-compose.yml

web:

build: .

ports:

​ - “5000:5000”

volumes:

​ - .:/code

links:

​ - redis

redis:

image:redis

Docker Compoase命令集

管理镜像 -build/pull

管理服务 -up/start/stop/kill/rm/scale

服务状态 -ps/logs/port

一次性命令 -run

Docker Swarm

容器管理技术

Kubernetes

(1)开源Docker容器编排系统

(2)轻量级、简单

(3)公有云、私有云以及混合云中部署

(4)模块化(modular),可插拔化,可挂接,可组合

(5)自动恢复,自动重启,自动复制

kubectl get nodes

kubectl get events

Pods

创建,调度以及管理的最小单元

共存的一组容器的集合

容器共享PID,网络,IPC及UTS命令空间

容器共享存储卷

短暂存在(pending running succeed fail)

kubectl create -f pod.yaml

kubectl get pods

kutectl delete pods nginx

kubectl get pods redis -o yaml

Labels

用以标示对象(如Pod)的key/value对

组织并选择对象子集

Replication Controllers

确保在任一时刻运行指定数目的Pod

Services

抽象了一系列Pod并定义其访问规则

固定IP地址和DNS域名

通过环境变量和DNS发现服务

负载均衡

外部服务 ClusterIP,NodePort,LoadBalancer

Docker常用命令:

https://www.jianshu.com/p/5caa68150661

常用命令

docker run -p 0.0.0.0:6000:6000 –name “test” -it centos

docker exec -it 4d34fbf944a5 /bin/bash

安装portainer管理平台

1
2
3
4
5
6
7
8
9
10
11
# 搜索镜像
docker search portainer
# 拉去镜像
docker pull portainer/portainer
# 运行镜像
# (1)本机模式
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer
# (2)远程模式
docker run -d -p 9000:9000 --restart=always --name prtainer portainer/portainer
# 访问Portainer容器
http://ip:9000
Author

jiangyao

Posted on

2021-06-12

Updated on

2023-02-23

Licensed under