Docker的基本操作
本文最后更新于147 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

基础操作


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

  • 守护进程的系统资源设置,可以查加速器地址,代理配置等信息

    file

  • overlay是一种存储驱动引擎,还有一种叫dm,老版本会有dm,没有overlay,目前版本的是overlay
    UFS是一个类别,里面包括了overlay和dm,我们目前info主要就是看overlay

docker search

  • Docker 仓库的查询,类似以yum的search,一般还是去网页下载
  • 去网页目录的时候很有必要看一看官方手册
    file
  • 最后一列是下载完了能不能直接run

docker pull

  • Docker仓库镜像的下载

docker images

  • Docker 镜像的查询
    file

    一:镜像名(仓库名) 二:版本号 三:镜像ID 四:创建时间 五:大小
    镜像ID是唯一做引,当然,也可以用 镜像名:版本号 来表示

docker rmi

  • Docker 镜像的删除,删不掉的话可以 -f 强制删除

docker rm

  • 容器的删除

docker ps

  • 容器的查询

注意 command是启动容器时的命令,而且不能写在/etc/rc.local中,因为那是centos启动的时候读取的,docker是直接在内核的基础上进行启动的,包括环境变量

docker run

  • 容器的创建启动

docker start/stop

  • 容器启动停止,镜像名和ID号都可以

Docker 指令除了单条使用外,还支持赋值、解析变量、嵌套使用

赋值,解析变量;

  • 比如我们有很多的容器,一个一个删除或者每次都要写个脚本是非常麻烦的,官方为了解决这个问题增加了一个功能,也就是我们使用docker命令时是可调用系统变量的,创建变量就是赋值。
    file

嵌套:和其他的命令结合结合

  • 测试图片
    file

单一容器管理命令

每个容器被创建后,都会分配一个 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)
    file

docker logs MywordPress

  • 查看容器日志(看到的内容和不加-d 展示的前台信息一样的)
    查看实时日志
    file

docker stats MywordPress

  • 查看容器所占用的系统资源
  • 会一直闪,因为是实时更新的,也可以看某一个容器
    file

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是随机的
    file

--dns xx.xx.xx.xx

  • 设置容器使用的 DNS 服务器

--dns-search

  • DNS 搜索设置(没啥用,一般都跟着主机走)

--add-host hostname:IP

  • 注入 hostname <> IP 解析(注意,这个是反的)
    file

--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 .
男孩子都是香香软软的小猪
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇