基础操作
Docker 三个重要概念:仓库 (Repository)、镜像 (image) 和 容器 (Container)
Docker 指令的基本用法
- docker + 命令关键字(COMMAND) + 一系列的参数
docker run --name MyWordPress --link db:mysql -p 8080:80 -d wordpress
--link db:mysql 就是把db的IP地址写到当前容器的/etc/hosts中,因为这是个私有地址,会一直变这个命令用于在Docker环境中启动一个名为 "MyWordPress" 的WordPress容器,并将其与一个名为 "db" 的MySQL容器进行链接。此外,它将容器的80端口映射到宿主机的8080端口,以便可以通过浏览器访问WordPress网站。最后,-d 参数表示容器将在后台运行。
基础命令
docker info
-
守护进程的系统资源设置,可以查加速器地址,代理配置等信息
-
overlay是一种存储驱动引擎,还有一种叫dm,老版本会有dm,没有overlay,目前版本的是overlay
UFS是一个类别,里面包括了overlay和dm,我们目前info主要就是看overlay
docker search
- Docker 仓库的查询,类似以yum的search,一般还是去网页下载
- 去网页目录的时候很有必要看一看官方手册
- 最后一列是下载完了能不能直接run
docker pull
- Docker仓库镜像的下载
docker images
- Docker 镜像的查询
一:镜像名(仓库名) 二:版本号 三:镜像ID 四:创建时间 五:大小
镜像ID是唯一做引,当然,也可以用 镜像名:版本号 来表示
docker rmi
- Docker 镜像的删除,删不掉的话可以 -f 强制删除
docker rm
- 容器的删除
docker ps
- 容器的查询
注意 command是启动容器时的命令,而且不能写在/etc/rc.local中,因为那是centos启动的时候读取的,docker是直接在内核的基础上进行启动的,包括环境变量
docker run
- 容器的创建启动
docker start/stop
- 容器启动停止,镜像名和ID号都可以
Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用
赋值,解析变量;
- 比如我们有很多的容器,一个一个删除或者每次都要写个脚本是非常麻烦的,官方为了解决这个问题增加了一个功能,也就是我们使用docker命令时是可调用系统变量的,创建变量就是赋值。
嵌套:和其他的命令结合结合
- 测试图片
单一容器管理命令
每个容器被创建后,都会分配一个 CONTAINER ID 作为容器的唯一标示,后续对容器的启动、停止、修改、删除等所有操作,都是通过 CONTAINER ID 来完成,偏向于数据库概念中的主键
docker ps --no-trunc
- --no-trunc 可以用在所有的需要显示全部的命令之后
docker stop/start CONTAINERID
- 停止/启动
docker start/stop MywordPress
- 通过容器别名启动/停止
docker inspect MywordPress
- 查看容器所有基本信息
查看详细信息,是目前最全的信息,只要是可以从docker读到,就有,并且这是json格式的
可以看见IP地址(mariadb没有ip)
docker logs MywordPress
- 查看容器日志(看到的内容和不加-d 展示的前台信息一样的)
查看实时日志
docker stats MywordPress
- 查看容器所占用的系统资源
- 会一直闪,因为是实时更新的,也可以看某一个容器
docker exec 容器名 容器内执行的命令
- 进入容器执行命令(需要封装好,因为centos不能直接启动)
- 限制很多,不能echo,没有make,而且vi进入会卡死,如果想进去执行,建议使用-it 打开终端
docker exec -it 容器名 /bin/bash
-
登入容器的bash,建议用这个
docker run -it --rm centos:7.9.2009 /bin/bash -i 进入交互模式,容器内可以和物理机交互 -t 创建一个虚拟的伪终端 --rm 退出容器即关闭容器 /bin/bash 替换当前镜像的默认启动命令,也就是说,当前镜像一启动执行的命令是/bin/bash
-
载入容器后运行bash ,docker中必须要保持一个进程的运行,要不然整个容器启动后就会马上kill itself,这样当你使用docker ps 查看启动的容器时,就会发现你刚刚创建的那个容器并不在已启动的容器队列中。这个/bin/bash就表示启动容器后启动bash。
run的子命令
--restart=always
- 容器的自动启动,集群就用kubernates了,会自动拉起
-h x.xx.xx
- 设置容器主机名,设置主机名以后启动这个容器直接-h 域名就可以了,毕竟ip是随机的
--dns xx.xx.xx.xx
- 设置容器使用的 DNS 服务器
--dns-search
- DNS 搜索设置(没啥用,一般都跟着主机走)
--add-host hostname:IP
- 注入 hostname <> IP 解析(注意,这个是反的)
--rm
- 服务停止时自动删除
Docker-Compose
概念
-
多容器编排工具
容器的启动是有关联的,比如,先启动mariadb再启动wordpress。
如果有很多的进程需要启动顺序,那么使用docker-compose就很简单 -
Docker 提倡理念是 “一个容器一个进程”,假设一个服务需要由多个进程组成,就需要多个容器组成一个系统,相互分工和配合对外提供完整服务
意思是一个主进程:比如一个ssh,一个Apache封装成一个进程,但是一个Apache和一个nginx就不建议了,可能会有冲突,一个挂了另一个主进程也挂了,不安全
比如:博客系统- 在启动容器时,同一台主机下如果两个容器之间需要由数据交流,使用 --link 选项建立两个容器之间的互联,前提是建立是 MySQL 已经开启
定义
-
容器编排工具,允许用户在一个模板( YAML 格式 )中定义一组相关联的容器,会根据 --link 等参数,对启动的优先级进行排序
-
官网下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
uname -s和uname -m命令用于获取当前系统的类型(例如Linux)和架构(例如x86_64),确保下载的是适合系统的版本。
docker version 看版本
YAML语法
- 编程免不了要写配置文件,怎么写配置也是一门学问。YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便
YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式
基本语法规则
- 大小写敏感
- 使用缩进表示层级关系——只允许使用空格,不能用TAB
- 缩进是不使用 tab 键,只允许使用空格
- 缩进的空格数目不重要,只要相同层级左侧的元素对其即可——一般是两个
- " # " 表示注释,从这个字符一直到行尾都会被解释器忽略
数据类型
-
对象类型:对象是一组键值对,使用冒号结构表示;冒号后必须加个空格
name: zhangsan age:18 和下面的格式是一样的效果 hash: {name: zhangsan, age: 18}
-
数组类型:一组连词线开头的行,构成一个数组
-
- zhangsan
- lisi
- wangwu
{name: ['zhangsan', 'lisi', 'wangwu']}
- 复合结构:对象和数组可以结合使用,形成复合结构
对象里套数组
languages:
- Ruby
- Perl
- Python
对象里套数组,数组里套对象
websites:
YAML:
ur1: www.yaml.org
domain: yaml.org
Ruby: ruby-lang.org
Python: python.org
Perl: use.perl.org
纯量:纯量是最基本的、不可再分的值
- 字符串
- 布尔值
- 整数
- 浮点数
- Null 空和不设置是两个概念,类似上自习和放假
- 时间
- 日期
# 数值直接以字面量的形式表示
number: 12.30
# 布尔值用 true 和 false 表示
isSet: true
# null 用 ~ 表示
parent: ~
# 时间采用 ISO8601 格式
iso8601: 2001-12-14t21:59:43.10-05:00
# 日期采用复合 iso8601 格式的年、月、日表示
# 基本用不上
date: 1976-07-31
# YAML 允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
麻烦,不如直接加双引号,表示字符串“123”
# 字符串默认不使用引号表示
str: 这是一行字符串
# 如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'
# 单引号和双引号都可以使用,双引号不会对特殊字符转义
s1: '内容\n字符串'
打印出来是: 内容
字符串
s2: "内容\n字符串"
打印出来是: 内容\n字符串
# 单引号之中如果还有单引号,必须连续使用两个单引号转义
str: ''''
例:'xxxx''xxxx'
结果:xxxx'xxxx
# 字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str: 这是一段(直接换行空格一下写就行,新版本不用空格,可以顶头写)
多行
字符串
## { str: '这是一段 多行 字符串' }
# 多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
aaa
打印结果:
Foo
Bar
aaa
that: >
Foo
Bar
打印结果;
Foo Bar aaa
## { this: 'Foo\nBar\n', that: 'Foo Bar\n' }
# +表示保留文字块末尾的换行,-表示删除字符串末尾的换行
s1: | 就保留一个换行符
Foo
s2: |+ 保留所有的换行符
Foo
s3: |- 一个都不保留
Foo
## { s1: 'Foo\n', s2: 'Foo\n\n\n', s3: 'Foo' }
# 锚点&和别名*,可以用来引用,但是如果中间的代码特别多,他要来回去找别名,费资源
也不符合正常逻辑
defaults: &defaults
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults
test:
database: myapp_test
<<: *defaults
==
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
数据类型:
-
强数值类型:你定义的是什么类型,比如,C语言,go,我就必须看到什么类型的值才能执行,1就是1,2就是2,除非你先把其他类型的(比如布尔值)转换成1和2,我才能识别继续。
-
弱数值类型:没把数据类型看的那么重,比如Python,yaml中,1可以是布尔值,2也可以是布尔值,他会自己慢慢去理解,这就是典型的弱数据类型,不需要你特意去声明,他会自己理解
-
布尔值:
-
非常少,判断是否,只占用一个字符
docker-compose 基本语法
version: '2'
services:
web:
image: dockercloud/hello-world
ports:
- 8080
networks:
- front-tier
- back-tier
redis:
image: redis
links:
- web
networks:
- back-tier
lb:
image: dockercloud/haproxy
ports:
- 80:80
links:
- web
networks:
- front-tier
- back-tier
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
front-tier:
driver: bridge
back-tier:
driver: bridge
1、image
services:
web:
image: hello-world
# 镜像可用格式
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
2、build
服务除了可以基于指定的镜像,还可以基于一份 Dockerfile,在使用 up 启动之时执行构建任务,这个构建标签就是 build,它可以指定 Dockerfile 所在文件夹的路径。Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器
build: /path/to/build/dir
也可以是相对路径,只要上下文确定就可以读取到 Dockerfile
build和image是相辅相成的,就像是给建筑取个名字,下次只要说名字就在地图上能找到了
args:环境变量
build: ./dir
build:
context: ../
dockerfile: path/of/Dockerfile
args:
buildno: 1
password: secret
image: webapp:tag
3、command
默认启动命令,这就相当于替换启动命令,把原本默认的变成command后面的
command: bundle exec thin -p 3000
# ==
command: [bundle, exec, thin, -p, 3000]
4、container_name:<项目名称><服务名称><序号>
就是别名,原本默认随机很长
container_name: app
5、depends_on
依赖关联,参考--link version:版本
version: '2'
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
6、dns
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
7、tmpfs
临时目录,可以存一些临时文件,用的不多
tmpfs: /run
tmpfs:
- /run
- /tmp
8、 entrypoint
也是一个启动命令,以后讲
entrypoint: /code/entrypoint.sh
9、env_file
大量的通过文件定义
指定环境变量,指的是文件路径
common.env文件内部
xxxx=xxxxx
xxx=xxx
格式一定是xxx等于xxx
env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
10、environment:镜像变量
少量的直接通过关键字定义
environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:
environment:
- RACK_ENV=development
- SHOW=true
- SESSION_SECRET
11、expose
声明特殊端口,要暴露不一定暴露
expose:
- "3000"
- "8000"
12、 external_links:链接外部容器
docker run启动的容器和docker-compose启动的容器网络是不互通的,是两个独立的内网,为了安全考虑
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
13、extra_hosts
类似于-h
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
14、labels - docker-swarm
docker-swarm的标签,swarm都没了
labels:
com.example.description: "Accounting webapp"
com.example.department: "Finance"
com.example.label-with-empty-value: ""
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
15、links:与 Docker client 的 --link 一样效果,会连接到其它服务中的容器
和depends_on一样,可以混合使用
links:
- db
- db:database
- redis
16、 logging
syslog,日志收集的服务
syslog服务器的地址
把所有的容器的日志都发给这个地址一起看
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
17、pid
pid: "host"
18、port
暴露几个就写几个
ports:
- "3000"
#随机绑定
#docker port 容器名 查看这个容器的端口绑定的端口号
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
19、security_opt
swarm的
# 为每个容器覆盖默认的标签。简单说来就是管理全部服务的标签。比如设置全部服务的user标签值为USER。
:
- label:user:USER
- label:role:ROLE
20、 stop_signal
关闭信号:-9,-15,不建议-9,-9太直接,会有很多在内存中的东西没保存就丢失了,也不要pkill
当然要是多次以后不搭理,那就-9干死他
信号就是操作系统给进程的沟通方式
stop_signal: SIGUSR1
21、volumes
持久化存储的
volumes:
// 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)。
- /var/lib/mysql
// 使用绝对路径挂载数据卷
- /opt/data:/var/lib/mysql
// 以 Compose 配置文件为中心的相对路径作为数据卷挂载到容器。
- ./cache:/tmp/cache
// 使用用户的相对路径(~/ 表示的目录是 /home/<用户目录>/ 或者 /root/)。
- ~/configs:/etc/configs/:ro
// 已经存在的命名的数据卷。
- datavolume:/var/lib/mysql
22、volumes_from:从其它容器或者服务挂载数据卷,可选的参数是 :ro或者 :rw,前者表示容器只读,后者表示容器对数据卷是可读可写的。默认情况下是可读可写的
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
23、cap_add, cap_drop
docker是非root的假root,所以他很多权限都没有
cap_add就是给权限的,不建议给all,那会很不安全
比如,不能修改网卡信息
cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN
--cap-add Add Linux capabilities
--cap-drop Drop Linux capabilities
--privileged Give extended privileges to this container
--device=[] Allows you to run devices inside the container without the --privileged flag.
SYS_MODULE Load and unload kernel modules.
SYS_RAWIO Perform I/O port operations (iopl(2) and ioperm(2)).
SYS_PACCT Use acct(2), switch process accounting on or off.
SYS_ADMIN Perform a range of system administration operations.
SYS_NICE Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes.
SYS_RESOURCE Override resource Limits.
SYS_TIME Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock.
SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals.
AUDIT_CONTROL Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules.
MAC_ADMIN Allow MAC configuration or state changes. Implemented for the Smack LSM.
MAC_OVERRIDE Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM).
NET_ADMIN Perform various network-related operations.
SYSLOG Perform privileged syslog(2) operations.
DAC_READ_SEARCH Bypass file read permission checks and directory read and execute permission checks.
LINUX_IMMUTABLE Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags.
NET_BROADCAST Make socket broadcasts, and listen to multicasts.
IPC_LOCK Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)).
IPC_OWNER Bypass permission checks for operations on System V IPC objects.
SYS_PTRACE Trace arbitrary processes using ptrace(2).
SYS_BOOT Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution.
LEASE Establish leases on arbitrary files (see fcntl(2)).
WAKE_ALARM Trigger something that will wake up the system.
BLOCK_SUSPEND Employ features that can block system suspend.
24、extends
类似于include,调用别的文件
extends:
file: common.yml
service: webapp
25、network_mode
network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"
26、 networks
services:
some-service:
networks:
- some-network
- other-network
Example
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
restart: always
ports:
- "8000:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
文件在/usr/local/bin/下
必须叫docker-compose.yml
或者docker-compose.yaml
之后直接docker-compose up -d
docker-compose子选项
-f 指定使用的 yaml 文件位置;默认只在当前目录下寻找yml和yaml,找不到的话可以-f加绝对路径
up -d 启动容器项目,放在后台
ps 显示所有容器信息 查看当前项目的所有容器
pause 暂停容器,类似于虚拟机的挂起,原理是把当前运行在内存中的进程状态写在磁盘中
unpause 恢复暂停
restart 重新启动容器 会按照顺序启动
logs 查看日志信息 所有日志全显示
rm 删除容器
config -q 验证 yaml 配置文件是否正确
stop 停止容器
start 启动容器,也会按照顺序启动
commit和DOCKERfile的区别
-
docker commit 容器转换为镜像
-
docker build 根据 Dockerfile 指令生成镜像
dockerfile和commit最大的区别就在于重用性,dockerfile是把镜像一层一层封装的,有很大重用性,而commit是直接把整个容器封装成镜像,只要有一点区别,就不能冲用。
比如想把PHP五点四换成7.0,dockerfile只需要改一行文件就行,但是commit只能重新把整个lamp环境重新搭建
commit
优点:简单 所见即所得
缺点:
1、镜像层级的重用性较差
2、安装过程的重用性较差
3、功能性不全
build
优点
1、镜像层级的重用性较高
2、安装过程的重用性较高
3、功能性全
缺点
逻辑能力要求较强
- 1、容器 > 镜像:docker commit CID -t xx.xx.xx
- 2、DockerFile
Dockfile 是一种被 Docker 程序解释的脚本,Dockerfile 由一条一条的指令组成,每条指令对应 Linux 下面的一条命令。Docker 程序将这些 Dockerfile 指令翻译真正的 Linux 命令。Dockerfile 有自己书写格式和支持的命令,Docker 程序解决这些命令间的依赖关系,类似于 Makefile。Docker 程序将读取 Dockerfile,根据指令生成定制的 image - 生成命令:docker build -t zhengxuesong/jdk-tomcat .