1. docker 安裝
step 1: 安裝必要的一些系統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Step 3: 更新並安裝 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
Step 4: 開啓Docker服務
sudo service docker start
注意使用yum安裝軟件時出現如下錯誤
http://mirrors.163.com/centos/5/os/i386/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
Trying other mirror.
執行如下命令
yum clean all
yum makecache
yum update
2. 什麼是docker
簡單的認爲docker 就是一個虛擬機。但架構不用於虛擬機
docker vs 虛擬機
A container runs natively on Linux and shares the kernel of the host machine with other containers. It runs a discrete process, taking no more memory than any other executable, making it lightweight.
By contrast, a virtual machine (VM) runs a full-blown “guest” operating system with virtual access to host resources through a hypervisor. In general, VMs provide an environment with more resources than most applications need.
官方解釋翻譯過來大概內容是docker 是直接運行在宿主機的內核上,在docker上面的各種容器是共享內核的。與之相反的是虛擬機(vm)通過hypervisor技術來虛擬出多個內核出來,比docker需要更多的資源。一句話docker比vm更輕量級
3. docker 運行的常用的容器命令
jenkins
docker run \
--name jenkins\
-d \
--rm \
-u root \
-p 8686:8080 \
-v /data/jenkins/jenkins-data:/var/jenkins_home \
-v /data/jenkins/run/docker.sock:/var/run/docker.sock \
-v /data/jenkins/home:/home \
jenkinsci/blueocean
注意:
–name 制定容器名
-u root 指定用戶
-d 後臺運行
-v volumn映射 host機器路徑:container 路徑
-p 端口映射 host機器端口:container 端口
Activemq
docker run --name activemq \
-d\
-v /data/activemq:/data/activemq \
-v /data/activemq/conf:/opt/activemq/conf\
-v /data/activemq/log:/var/log\
-p 61616:61616\
-p 8161:8161\
webcenter/activemq
Zookeeper
docker run \
--name zookeeper \
--hostname zookeeper \
--restart always -d \
-p 2181:2181 -p 2888:2888 -p 3888:3888 \
-v /data/zk/conf:/conf \
-v /data/zk/data:/data \
-v /data/zk/datalog:/datalog \
zookeeper
Mysql
docker run -p 3306:3306 \
--name mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=devuser \
-d mysql:latest
- -p 3306:3306:將容器的 3306 端口映射到主機的 3306 端口。
- -v -v $PWD/conf:/etc/mysql/conf.d:將主機當前目錄下的 conf/my.cnf 掛載到容器的 /etc/mysql/my.cnf。
- -v $PWD/logs:/logs:將主機當前目錄下的 logs 目錄掛載到容器的 /logs。
- -v $PWD/data:/var/lib/mysql :將主機當前目錄下的data目錄掛載到容器的 /var/lib/mysql 。
- -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用戶的密碼。
Redis
docker run --name redis \
-p 6379:6379 \
-v /data/redis/data:/data \
--appendonly yes \
-d redis:3.2
4. docker配置加速鏡像
上面的命令運行時候回去下載鏡像,在國內下載的速度很慢,可以配置鏡像
修改/etc/docker/daemon.json,加入
{
"registry-mirrors": [
"http://hub-mirror.c.163.com"
],
"storage-driver": "devicemapper"
}
systemctl daemon-reload
systemctl restart docker.service
或者
修改或新增 /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --registry-mirror=http://hub-mirror.c.163.com'
以上是網上搜到的2種解決的,但我本地不知道爲什麼都不生效,所以採用第三種,到
https://hub.daocloud.io/查到需要的的容器,例如 elasticsearch
5. docker 如何知道容器裏的參數
docker run 命令執行的時候,需要傳入參數,有時候不知道參數是什麼。
比如 activemq
docker run --name activemq
-d
-v /data/activemq:/data/activemq
-v /data/activemq/conf:/opt/activemq/conf
-v /data/activemq/log:/var/log
-p 61616:61616
-p 8161:8161
webcenter/activemq
如何知道 activemq裏的volumn 是 /data/activemq,又如何知道它有哪些端口
可以先默認的docker run --name myactivemq webcenter/activemq 先執行一個後
執行
docker inspect myactivemq
就可以從Config節點獲取到,如下
"Config": {
"Hostname": "3d8ee09e3acb",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"1883/tcp": {},
"5672/tcp": {},
"61613/tcp": {},
"61614/tcp": {},
"61616/tcp": {},
"8161/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"ACTIVEMQ_CONFIG_DIR=/opt/activemq/conf.tmp",
"ACTIVEMQ_DATA_DIR=/data/activemq"
],
"Cmd": [
"/app/run.sh"
],
"ArgsEscaped": true,
"Image": "webcenter/activemq",
"Volumes": {
"/data/activemq": {},
"/opt/activemq/conf": {},
"/var/log/activemq": {}
},
"WorkingDir": "/opt/activemq",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
}
6.docker 官方get started
幾個概念
單詞 | 中文 | 解釋 |
---|---|---|
container | 容器 | |
swarm | 集羣 | 真實的或虛擬的機器組成的swarm集羣 |
services | 服務 | 通過docker-compose.yml 將service集合在一起稱之爲服務,每個service就是一個container |
stack | 通過docker stack 可以將docker-compose.yml部署到swarm裏 |
7. 使用docker-compose來配置
什麼是docker-compose?
使用一個 Dockerfile 模板文件可以定義一個單獨的應用容器,如果需要定義多個容器就需要服務編排。服務編排有很多種技術方案, Docker 官方產品 Docker Compose 就是其中之一
Dockerfile 可以讓用戶管理一個單獨的應用容器;而 Compose 則允許用戶在一個模板(YAML 格式)中定義一組相關聯的應用容器(被稱爲一個 project,即項目),例如一個 Web 服務容器再加上後端的數據庫服務容器等。
通過 Docker-Compose 用戶可以很容易地用一個配置文件定義一個多容器的應用,然後使用一條指令安裝這個應用的所有依賴,完成構建。Docker-Compose 解決了容器與容器之間如何管理編排的問題。
安裝docker-compose的步驟
sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
測試命令如下,能打印東西就代表成功了
docker-compose --version
建立docker-compose.yml
內容如下
version: '3'
services:
db1:
image: mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=devuser
- MYSQL_DATABASE=hellomall
volumes:
- "/data/docker/mysql:/var/lib/mysql" // 前面的是宿主機的路徑,後面的是容器裏的路徑,先建立mkdir -p /data/docker/mysql
elasticsearch:
image: elasticsearch:6.6.1
environment:
- cluster.name=elasticsearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
- 9300:9300
volumes:
- "/data/docker/es/data:/usr/share/elasticsearch/data"
kibana:
image: kibana:6.6.1
environment:
SERVER_NAME:
ELASTICSEARCH_HOSTS: http://localhost:9200
ports:
- 5601:5601
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: localhost
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
redis:
image: redis
ports:
- "6380:6379"
下一步就是要將docker-compose.yml部署成爲一個服務集合(services),進行這步之前需要建立一個swarm
docker swarm init --advertise-addr 192.168.1.105
什麼是swarm
A swarm is a group of machines that are running Docker and joined into a cluster.After that has happened, you continue to run the Docker commands you’re used to, but now they are executed on a cluster by a swarm manager. The machines in a swarm can be physical or virtual. After joining a swarm, they are referred to as nodes.(官方定義swarm是一組運行docker的機器組成的一個集羣,組成集羣后,可以在swarm manager的機器上來執行之前運行 docker的命令。機器裏的機器稱爲 node )
如上圖所示:現在已經建立了一個swarm集羣.
接下來就可以將上面的docker-compose.yml部署成爲一個services
新增一個services,名爲getstartedlab
docker stack deploy -c docker-compose.yml getstartedlab
刪除名爲getstartedlab的services
docker stack rm getstartedlab
查看所有的service
docker service ls
查看services裏的某個service,例如看getstartedlab這個services裏的service getstartedlab_web
docker service ps getstartedlab_web
查看servicegetstartedlab,可以查看總的日誌
docker stack ps getstartedlab
建立一個swarm(集羣)
機器類型:
IP | 角色 |
---|---|
192.168.1.111 | worker |
192.168.1.105 | master |
192.168.1.106 | worker |
8. docker 碰到的問題
- 問題1
docker: Error response from daemon: driver failed programming external connectivity on endpoint jenkins (322630d9843d744f8efa4ce07632025c0105a5933a42e3413ea6d4538b41aeba): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8686 -j DNAT --to-destination 172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match by that nam
解決:
systemctl restart docker
-
問題3
出現下面的問題
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
配置鏡像加速後出現的
解決:
systemctl daemon-reload
systemctl restart docker.service