docker及docker-compose學習
一 docker簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口
docker架構
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。Docker 容器通過 Docker 鏡像來創建。
容器與鏡像的關系類似於面向對象編程中的對象與類。
基礎構件
Docker 鏡像(Images) |
Docker 鏡像是用於創建 Docker 容器的模板。 |
Docker 容器(Container) |
容器是獨立運行的一個或一組應用。 |
Docker 客戶端(Client) |
Docker 客戶端通過命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 與 Docker 的守護進程通信。 |
Docker 主機(Host) |
一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。 |
Docker 倉庫(Registry) |
Docker 倉庫用來保存鏡像,可以理解為代碼控制中的代碼倉庫。 Docker Hub(https://hub.docker.com) 提供了龐大的鏡像集合供使用。
|
Docker Machine |
Docker Machine是一個簡化Docker安裝的命令行工具,通過一個簡單的命令行即可在相應的平臺上安裝Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
docker安裝
centos7下
先安裝依賴
yum install -y yum-utils device-mapper-persistent-data lvm2 再安裝 yum -y install docker-ce
啟動 systemctl start docker
常用命令總結
docker search 查找位於dockerhub的鏡像
如 docker search java
docker pull 下載鏡像
如 docker pull java
docker images 列出鏡像
docker rmi 即刪除鏡像
如 docker rmi java
docker save 即保存鏡像
如 docker save java >java.tar
docker load 即 加載鏡像
如 docker load <java.tar
另外 docker還可以通過dokcerfile創建鏡像
命令格式 dokcer build [OPTION] PATH |URL| -
示例先下載基礎 centos鏡像
docker pull centos
編寫nginx dockerfile
cat Dockerfile
# base image
FROM centos
# MAINTAINER
MAINTAINER [email protected]
# put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
# running required command
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx
# change dir to /usr/local/src/nginx-1.12.2
WORKDIR /usr/local/src/nginx-1.12.2
# execute command to compile nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
EXPOSE 80
下載nginx源碼 到當前路徑
執行構建 docker build -t centos_nginx:v1 .
docker images 查看
docker容器常用命令
啟動容器
如 1 docker run java /bin/echo ‘hello world‘
2 docker run -d -p 91:80 nginx 啟動一個nginx 容器 並映射了91端口可以訪問。
列出容器
docker ps
停止容器
docker stop ${容器id} -t (等待時間)
docker kill ${容器id} 強制關閉
啟動已停止的容器
docker start ${容器id}
重啟 docker restart ${容器id}
進入容器
docker attach ${容器id}
或者
docker exec -it ${容器id} /bin/bash
刪除容器
docker rm ${容器id}
刪除所有容器
docker rm -f $(docker ps -a -q )謹慎使用
導出容器
docker export nginx-test >nginx-test.tar
導入容器
docker import nginx-test.tar nginx-test2
二 docker-compose簡介
Compose 是一個用戶定義和運行多個容器的 Docker 應用程序。在 Compose 中你可以使用 YAML 文件來配置你的應用服務。然後,只需要一個簡單的命令,就可以創建並啟動你配置的所有服務。
安裝docker-compose
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose --version
docker-compose version 1.16.1, build 6d1ac21
使用流程
a 在 Dockfile 中定義你的應用環境,使其可以在任何地方復制。
b 在 docker-compose.yml 中定義組成應用程序的服務,以便它們可以在隔離的環境中一起運行。
c 最後,運行dcoker-compose up
,Compose 將啟動並運行整個應用程序
示例
準備工作:提前下載好鏡像:
docker pull mysql
docker pull wordpress
需要新建一個空白目錄,例如wptest。新建一個docker-compose.yml
version: ‘2‘
services:
web:
image: wordpress:latest
links:
- db
ports:
- "8002:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: 123456
db:
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=123456
以上命令的意思是新建db和wordpress容器。等同於:
$ docker run --name db -e MYSQL_ROOT_PASSWORD=123456 -d mysql
$ docker run --name some-wordpress --link db:mysql -p 8002:80 -d wordpress
註意,如果你是直接從fig遷移過來的,且
web
裏links
是- db:mysql
,這裏會提示沒有給wordpress設置環境變量,這裏需要添加環境變量WORDPRESS_DB_HOST
和WORDPRESS_DB_PASSWORD
。
好,我們啟動應用:
# docker-compose up
Creating wptest_db_1...
Creating wptest_wordpress_1...
Attaching to wptest_db_1, wptest_wordpress_1
wordpress_1 | Complete! WordPress has been successfully copied to /var/www/html
就成功了。瀏覽器訪問 http://192.168.1.115:8002 。
默認是前臺運行並打印日誌到控制臺。如果想後臺運行,可以:
docker-compose up -d
服務後臺後,可以使用下列命令查看狀態:
# docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------
figtest_db_1 docker-entrypoint.sh mysqld Up 3306/tcp
figtest_wordpress_1 docker-entrypoint.sh apach ... Up 0.0.0.0:8002->80/tcp
# docker-compose logs
Attaching to wptest_wordpress_1, wptest_db_1
db_1 | 2016-10-14T14:38:46.498030Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
db_1 | 2016-10-14T14:38:46.499974Z 0 [Note] mysqld (mysqld 5.7.15) starting as process 1 ...
db_1 | 2016-10-14T14:38:46.727191Z 0 [Note] InnoDB: PUNCH HOLE support available
停止服務:
# docker-compose stop
Stopping wptest_wordpress_1...
Stopping wptest_db_1...
重新啟動服務:
docker-compose restart
docker-compose.yml參考
每個docker-compose.yml必須定義image
或者build
中的一個,其它的是可選的。
image
指定鏡像tag或者ID。示例:
image: redis
image: ubuntu:14.04
image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd
註意,在
version 1
裏同時使用image
和build
是不允許的,version 2
則可以,如果同時指定了兩者,會將build
出來的鏡像打上名為image
標簽。
build
用來指定一個包含Dockerfile
文件的路徑。一般是當前目錄.
。Fig將build並生成一個隨機命名的鏡像。
註意,在
version 1
裏bulid
僅支持值為字符串。version 2
裏支持對象格式。
build: ./dir
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
context
為路徑,dockerfile
為需要替換默認docker-compose
的文件名,args
為構建(build)過程中的環境變量,用於替換Dockerfile裏定義的ARG
參數,容器中不可用。示例:
Dockerfile:
ARG buildno
ARG password
RUN echo "Build number: $buildno"
RUN script-requiring-password.sh "$password"
docker-compose.yml:
build:
context: .
args:
buildno: 1
password: secret
build:
context: .
args:
- buildno=1
- password=secret
command
用來覆蓋缺省命令。示例:
command: bundle exec thin -p 3000
command
也支持數組形式:
command: [bundle, exec, thin, -p, 3000]
links
用於鏈接另一容器服務,如需要使用到另一容器的mysql服務。可以給出服務名和別名;也可以僅給出服務名,這樣別名將和服務名相同。同docker run --link
。示例:
links:
- db
- db:mysql
- redis
使用了別名將自動會在容器的/etc/hosts
文件裏創建相應記錄:
172.17.2.186 db
172.17.2.186 mysql
172.17.2.187 redis
所以我們在容器裏就可以直接使用別名作為服務的主機名。
ports
用於暴露端口。同docker run -p
。示例:
ports:
- "3000"
- "8000:8000"
- "49100:22"
- "127.0.0.1:8001:8001"
expose
expose提供container之間的端口訪問,不會暴露給主機使用。同docker run --expose
。
expose:
- "3000"
- "8000"
volumes
掛載數據卷。同docker run -v
。示例:
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
volumes_from
掛載數據卷容器,掛載是容器。同docker run --volumes-from
。示例:
volumes_from:
- service_name
- service_name:ro
- container:container_name
- container:container_name:rw
container:container_name
格式僅支持version 2
。
environment
添加環境變量。同docker run -e
。可以是數組或者字典格式:
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
depends_on
用於指定服務依賴,一般是mysql、redis等。
指定了依賴,將會優先於服務創建並啟動依賴。
links
也可以指定依賴。
external_links
鏈接搭配docker-compose.yml
文件或者Compose
之外定義的服務,通常是提供共享或公共服務。格式與links
相似:
external_links:
- redis_1
- project_db_1:mysql
- project_db_1:postgresql
註意,
external_links
鏈接的服務與當前服務必須是同一個網絡環境。
extra_hosts
添加主機名映射。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
將會在/etc/hosts
創建記錄:
162.242.195.82 somehost
50.31.209.229 otherhost
extends
繼承自當前yml文件或者其它文件中定義的服務,可以選擇性的覆蓋原有配置。
extends:
file: common.yml
service: webapp
service
必須有,file
可選。service
是需要繼承的服務,例如web
、database
。
net
設置網絡模式。同docker的--net
參數。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"
dns
自定義dns服務器。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
cpu_shares, cpu_quota, cpuset, domainname, hostname, ipc, mac_address, mem_limit, memswap_limit, privileged, read_only, restart, shm_size, stdin_open, tty, user, working_dir
cpu_shares: 73
cpu_quota: 50000
cpuset: 0,1
user: postgresql
working_dir: /code
domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43
mem_limit: 1000000000
mem_limit: 128M
memswap_limit: 2000000000
privileged: true
restart: always
read_only: true
shm_size: 64M
stdin_open: true
tty: true
命令行參考
$ docker-compose
Define and run multi-container applications with Docker.
Usage:
docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
docker-compose -h|--help
Options:
-f, --file FILE Specify an alternate compose file (default: docker-compose.yml)
-p, --project-name NAME Specify an alternate project name (default: directory name)
--verbose Show more output
-v, --version Print version and exit
-H, --host HOST Daemon socket to connect to
--tls Use TLS; implied by --tlsverify
--tlscacert CA_PATH Trust certs signed only by this CA
--tlscert CLIENT_CERT_PATH Path to TLS certificate file
--tlskey TLS_KEY_PATH Path to TLS key file
--tlsverify Use TLS and verify the remote
--skip-hostname-check Don‘t check the daemon‘s hostname against the name specified
in the client certificate (for example if your docker host
is an IP address)
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pulls service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
docker及docker-compose學習