Docker 基礎知識-入門篇
1.1 docker的三大理念
- 構建
- 運輸
- 運行
ps:有點類似於java代碼,一次構建到處運行
1.2 docker結構
相關說明:
image: 和虛擬機的鏡像類似
container: 用鏡像創建的實例
repository: 類似於yum倉庫
docker client: 命令行輸入的docker命令
docker server: 啟動的docker進程
1.3 docker和kvm的區別
1.虛擬機需要hypervisor這個中間層來進行支持,上面跑的每一個虛擬機他們之間都是相互隔離的,都有獨立的操作系統。
2.docker 需要docker engine來進行支持,每個container之間 , 用lxc技術來進行隔離。
1.4 docker改變了什麽?
- 簡化配置
- 代碼流水線管理
- 簡化環境配置
- 應用隔離
- 服務合並
- 調試能力
- 多用戶環境
- 快速上線
2. docker基礎知識
2.1 安裝docker軟件
yum -y install docker
systemctl start docker
systemctl enable docker
2.2 常規操作
搜索鏡像
docker search centos
導出鏡像
docker save -o centos.tar centos
導入鏡像
docker load -i centos.tar
查看導入的images
[root@hr-vm-11 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos latest 8140d0c64310 7 weeks ago 192.5 MB docker.io/nginx latest 3448f27c273f 7 weeks ago 109.4 MB
刪除鏡像
ps: 如果鏡像有已創建的容器, 鏡像是無法被刪除的.
[root@hr-vm-11 ~]# docker rmi centos Untagged: centos:latest Deleted: sha256:8140d0c64310d4e290bf3938757837dbb8f806acba0cb3f6a852558074345348 Deleted: sha256:b51149973e6a6c4fb1091ef34ff70002ee307e971b9982075cf226004a93c9b7 [root@hr-vm-11 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/nginx latest 3448f27c273f 7 weeks ago 109.4 MB
啟動docker容器
格式: docker run 參數 容器名 執行的命令
[root@hr-vm-11 ~]# docker run --rm -i -t centos hostname
7d7e0e228d24
進入到docker
[root@hr-vm-11 ~]# docker run --rm -i -t centos /bin/bash
[root@c8efa61caf0e /]#
查看docker所有創建的容器
[root@hr-vm-11 ~]# docker run -i -t centos ps -a
PID TTY TIME CMD
[root@hr-vm-11 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
53c158c4560b centos "ps -a" 6 seconds ago Exited (1) 4 seconds ago admiring_roentgen
查看正在運行的容器
ps: 只有將程序啟動在前臺, 在這裏才能看到.
docker ps
用帶標簽的方式啟動docker
ps: 如果有修改容器裏文件內容的需求, 需要重新的創建容器,因為docker的理念是不可變基礎設施.
[root@hr-vm-11 ~]# docker run --name centosv1 -i -t centos /bin/bash
[root@4ddd206ef3ce /]# exit
[root@hr-vm-11 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ddd206ef3ce centos "/bin/bash" 8 seconds ago Exited (0) 4 seconds ago centosv1
53c158c4560b centos "ps -a" 5 minutes ago Exited (1) 5 minutes ago admiring_roentgen
用標簽啟動
ps: 此時這個container沒有運行, 因為沒有程序運行在前臺.
docker start centosv1
docker stop centosv1
只運行容器,運行過後就刪除
(ps:container執行過命令之後就會自動的刪除掉)
[root@hr-vm-11 ~]# docker run --rm -i -t centos echo hehe
hehe
[root@hr-vm-11 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ddd206ef3ce centos "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago centosv1
53c158c4560b centos "ps -a" 12 minutes ago Exited (1) 11 minutes ago admiring_roentgen
刪除容器
ps: 如果容器在運行,無法被刪除.
docker rm ‘容器名‘
-d
運行一個容器在後臺,並打印出容器id
[root@hr-vm-11 ~]# docker run -d --name nginx2 nginx
d609da66283da14b6b4f07d7adf801640270904aebd274054914c1000a0b912f
[root@hr-vm-11 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d609da66283d nginx "nginx -g ‘daemon off" 30 seconds ago Up 28 seconds 80/tcp nginx2
查看容器的日誌
docker logs nginx2
2.3 進入容器
方法一: 使用attach
進入容器,退出後,容器也退出了, 生產環境裏不用.
[root@hr-vm-11 ~]# docker run --name centosv1 -i -t centos /bin/bash
[root@47d5b101d62c /]# exit
[root@hr-vm-11 ~]# docker start centosv1
centosv1
[root@hr-vm-11 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47d5b101d62c centos "/bin/bash" 31 seconds ago Up 19 seconds centosv1
[root@hr-vm-11 ~]# docker attach centosv1
[root@47d5b101d62c /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 11768 1872 ? Ss 16:39 0:00 /bin/bash
root 15 0.0 0.0 47440 1676 ? R+ 16:39 0:00 ps aux
[root@47d5b101d62c /]# exit
[root@hr-vm-11 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@hr-vm-11 ~]#
方法二:使用nsenter
進入容器後,ps aux 發現是單獨的開了一個進程進去的.
[root@hr-vm-11 ~]# yum -y install util-linux
獲取到容器pid
[root@hr-vm-11 ~]# docker inspect -f ‘{{.State.Pid}}‘ nginx2
5730
進入容器
[root@hr-vm-11 ~]# nsenter -t 5730 -m -u -i -n -p
ps aux發現是利用nsentor進入container 是單獨的開了一個進程的.
[root@47d5b101d62c /]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 11768 1680 ? Ss+ 16:47 0:00 /bin/bash
root 29 0.0 0.1 15200 1992 ? S 16:53 0:00 -bash
root 42 0.0 0.0 50872 1820 ? R+ 16:53 0:00 ps aux
[root@47d5b101d62c /]# logout
退出之後centosv1依然運行在後臺
[root@hr-vm-11 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
47d5b101d62c centos "/bin/bash" 14 minutes ago Up 5 minutes centosv1
ps: 生產環境應該寫成一個腳本,利用腳本進入
[root@hr-vm-10 ~]# cat docker.sh
#!/bin/bash
# auth: [email protected]
# des: login in docker
function docker_in(){
Name=$1
[ -z "$Name" ] && echo ‘error‘ && exit
DockerPid=$(docker inspect -f ‘{{.State.Pid}}‘ $Name)
nsenter -t ${DockerPid} -m -u -i -n -p
}
docker_in $1
[root@hr-vm-10 ~]# chmod +x docker.sh
[root@hr-vm-10 ~]# ./docker.sh centosv1
[root@47d5b101d62c /]#
方法三:
exec 運行一個命令在一個已經運行的容器裏.(生產環境不用,有坑)
[root@hr-vm-10 ~]# docker exec centosv1 date
Wed Jul 5 10:24:15 UTC 2017
[root@hr-vm-10 ~]# docker exec -it centosv1 /bin/bash
[root@47d5b101d62c /]#
3. docker網絡訪問
3.1 隨機映射-P
-P 隨機映射
[root@hr-vm-10-docker ~]# docker run -d --name nginx-v1 -P nginx
59a85323c8afab3bb9c2e450cf96d6448b075bdf5e361d0bf141ccfe660c243e
查看映射的端口
方法一:
[root@hr-vm-10-docker ~]# docker port nginx-v1
80/tcp -> 0.0.0.0:32770
方法二:
[root@hr-vm-10-docker ~]# iptables -t nat -vnL|grep DNAT
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:32770 to:172.17.0.9:80
3.2 指定端口映射
格式:
-
-p hostPort:containerPort
docker run -d --name nginx-v2 -p 8088:80 nginx
-
-p ip:hostPort:containerPort
docker run -d --name nginx-v3 -p 192.168.1.11:8089:80 nginx
-
-p ip::containerPort
docker run -d --name nginx-v4 -p 192.168.1.11::80 nginx
- -p hostPort:containerPort:udp
docker run -d --name nginx-v5 -p 8088:80:udp nginx
ps: 可以使用-p來綁定多個端口.
docker run -d --name nginx-v6 -p 81:80 -p 83:22 nginx
4. docker數據管理
docker鏡像是分層設計的,容器也可以封裝成一個image
4.1 數據卷
使用數據卷可以提高性能, 類似與mount.
-v /data 隨機掛載系統目錄
ps: 使用此方式掛載後,你也不知道掛載的是哪個目錄,不建議使用
[root@hr-vm-10 ~]# docker run -d --name nginxv20 -v /data/ nginx
7e8f0744eb3fed1b402b35dba0c7ca3cdd743edbced67b47781ab0fcbcbdee23
[root@hr-vm-10 ~]# ./docker.sh nginxv20
mesg: ttyname failed: No such file or directory
df -h 也看不見掛載的是系統的那個目錄
root@7e8f0744eb3f:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-253:1-665852-39abc775a9c003ffeca984adf975e8fc43fb4727803daa6a923c1c72a1934e74 10G 148M 9.9G 2% /
tmpfs 912M 0 912M 0% /dev
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.2G 15G 13% /data
shm
查看掛載的系統目錄是哪個物理目錄
[root@hr-vm-10 ~]# docker inspect -f {{.Mounts}} nginxv20
[{844b66331c243b7a1914eb65ec68f83da35d360e14789f216fded8527c0f8f76 /var/lib/docker/volumes/844b66331c243b7a1914eb65ec68f83da35d360e14789f216fded8527c0f8f76/_data /data local true }]
-v src:dst 掛載指定的目錄
ps: 可移植性差,換個機器就不一定有你掛載的這個目錄.
[root@hr-vm-10 ~]# docker run -d --name nginxv100 -v /data/images:/data nginx
c9358e2ce458293cad9a5f4fae95172b5d6609b1126f607b661e30a6d87dd21b
[root@hr-vm-10 ~]# ./docker.sh nginxv100
root@c9358e2ce458:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/docker-253:1-665852-0de2894a933e80bdcabd8364266e0094272889a7a76d312b98ee2eaf4f60da7c 10G 147M 9.9G 2% /
tmpfs 912M 0 912M 0% /dev
tmpfs 912M 0 912M 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 2.2G 15G 13% /data
shm 64M 0 64M 0% /dev/shm
root@c9358e2ce458:/#
[root@hr-vm-10 data]# docker inspect -f {{.Mounts}} nginxv100
[{ /data/images /data true rprivate}]
4.2 數據卷容器
--volumes-from
一個容器可以訪問另外一個容器的卷,適用於在多個容器中共享.
ps: 另外一個容器卷如果被使用, 是無法刪除的,當使用了數據卷容器.
[root@hr-vm-10 ~]# docker run -d --name nginxv101 --volumes-from nginxv100 nginx
4455e9ad2bc6947009e831b21923c06c85a32680aaafab74b7d4f71b003dcc51
[root@hr-vm-10 ~]# ./docker.sh nginxv101
mesg: ttyname failed: No such file or directory
root@4455e9ad2bc6:/# cd /data/
root@4455e9ad2bc6:/data# ls
hehe.jpg
[root@hr-vm-10 ~]# docker inspect -f {{.Mounts}} nginxv101
[{ /data/images /data true rprivate}]
[root@hr-vm-10 ~]#
5. Docker鏡像構建和Dockerfile
5.1 手動構建
啟動一個容器,進入容器裏安裝所需要的軟件.
docker run --name mynginx -it centos
./docker.sh mynginx
yum -y install nginx
echo ‘deamon off;‘ >>/etc/nginx/nginx.conf
提交鏡像
[root@hr-vm-10 ~]# docker commit -m ‘my nginx‘ 4916e87a3e1f wangfei/mynginx:v1
sha256:9a18e628ede9cb1245d1c144eb8ac389aa85c2f296d1b3366c858c094ab859ba
[root@hr-vm-10 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wangfei/mynginx v1 9a18e628ede9 26 seconds ago 381.6 MB
docker.io/centos latest 8140d0c64310 7 weeks ago 192.5 MB
docker.io/nginx latest 3448f27c273f 8 weeks ago 109.4 MB
5.2 利用Dockerfile構建
Dockerfile語法格式參考鏈接
目標: 用dockerfile構建一個nginx容器
[root@hr-vm-10 ~]# mkdir -p /opt/dockerfile/nginx/
# Description: build nginx container
# Base images
# 除註釋的第一行,必須是FROM
From centos
# Maintainer
MAINTAINER [email protected]
# Run commands
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum -y install nginx
RUN echo ‘daemon off;‘>>/etc/nginx/nginx.conf
# EXPOSE
EXPOSE 80
# CMD
CMD ["nginx"]
ps: Dockerfile文件名,D必須大寫.
build構建
[root@hr-vm-10 ~]# docker build -t mynginx:v2 /opt/dockerfile/nginx/
[root@hr-vm-10 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx v2 a03c3c8678c2 8 minutes ago 401.3 MB
wangfei/mynginx v1 9a18e628ede9 44 minutes ago 381.6 MB
docker.io/centos latest 8140d0c64310 7 weeks ago 192.5 MB
docker.io/nginx latest 3448f27c273f 8 weeks ago 109.4 MB
用構建的鏡像啟動一個容器
[root@hr-vm-10 ~]# docker run -d --name Mynginx -p 18080:80 nginx
6. Dockerfile生產實踐
docker 鏡像文件是分層設計, 在編寫dockerfile文件時,將dockerfile按照層次細分成多個組件, 然後將經常需要變動的放在下面.dockerfile當發生變動時,都會重新構建.
6.1 設計分層
[root@hr-vm-10 ~]# mkdir -p /opt/docker/{runtime,app,system}
[root@hr-vm-10 ~]# mkdir -p /opt/docker/runtime/{php,java,python}
[root@hr-vm-10 ~]# mkdir -p /opt/docker/system/{centos,centos-ssh,ubuntu}
[root@hr-vm-10 ~]# tree /opt/docker
/opt/docker
├── app
├── runtime 運行環境層
│ ├── java
│ ├── php
│ └── python
└── system 系統層
├── centos
├── centos-ssh
└── ubuntu
9 directories, 0 files
6.2 構建一個基礎 鏡像 centos環境的dockerfile文件
[root@hr-vm-10 centos]# ll
total 8
-rw-r--r--. 1 root root 254 Jul 7 00:00 Dockerfile
-rw-r--r--. 1 root root 1084 Jul 7 00:00 epel.repo
[root@hr-vm-10 centos]# cat Dockerfile
# Base images for centos
# Base images
FROM centos
# Maintainer
MAINTAINER [email protected]
# Copy file
COPY epel.repo /etc/yum.repos.d/
#Base Pkg
RUN yum clean all
RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc
[root@hr-vm-10 centos]# docker build -t centos:v1 .
[root@hr-vm-10 centos]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 011d5c16b681 16 seconds ago 404.7 MB
mynginx v2 a03c3c8678c2 4 hours ago 401.3 MB
wangfei/mynginx v1 9a18e628ede9 5 hours ago 381.6 MB
docker.io/centos latest 8140d0c64310 7 weeks ago 192.5 MB
docker.io/nginx latest 3448f27c273f 8 weeks ago 109.4 MB
6.3 生產實戰1
環境說明
管理程序:supervisord
應用環境:python
需要啟動的應用:python程序 ssh服務
系統環境: centos
技巧
1.先在測試環境將環境部署好,然後將其配置文件copy過來,再寫dockerfile文件
2.編寫dockfile文件的時候,將經常變動的操作放在下面(docker images 是分層設計的,上面一動,下面的就都得重新構建,速度很慢。)
目錄分層
[root@hr-vm-10 docker]# tree
.
├── app
│ └── shop-api
│ ├── app.py
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── supervisord.conf
│ └── supervisord.ini
├── runtime
│ ├── java
│ ├── php
│ └── python
└── system
├── centos
│ ├── Dockerfile
│ └── epel.repo
├── centos-ssh
│ └── Dockerfile
└── ubuntu
10 directories, 8 files
構建基礎鏡像的dockerfile文件
[root@hr-vm-10 dockeri]# cat system/centos/Dockerfile
# Base images for centos
# Base images
FROM centos
# Maintainer
MAINTAINER [email protected]
# Copy file
COPY epel.repo /etc/yum.repos.d/
#Base Pkg
RUN yum clean all
RUN yum -y install wget mysql-devel supervisor git redis tree net-tools sudo psmisc python-devel python-pip supervisor vim openssh-server openssh-clients openssh
RUN pip install --upgrade pip
[root@hr-vm-10 docker]# docker build -t centos:v3 system/centos/
生產環境dockerfile文件
[root@hr-vm-10 docker]# cat app/shop-api/Dockerfile
# Description: shop-api
# Base images
FROM centos:v3
# Maintainer
MAINTAINER [email protected]
# Copy file
COPY app.py /opt/
COPY requirements.txt /opt/
COPY supervisord.conf /etc/supervisord.conf
COPY supervisord.ini /etc/supervisord.d/
# Add user
RUN useradd -u 1000 -s /sbin/nologin www
# Install pip dep
RUN pip install -r /opt/requirements.txt
# clear ssh cer
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key
RUN echo "root:abc#123"|chpasswd
# Expose
EXPOSE 80 5000
# CMD
CMD ["supervisord","-c","/etc/supervisord.conf"]
app python程序
[root@hr-vm-10 docker]# cat app/shop-api/app.py
from flask import Flask
app = Flask(__name__)
@app.route(‘/‘)
def hello():
return ‘Hello World!‘
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
pip 安裝的軟件
[root@hr-vm-10 docker]# cat app/shop-api/requirements.txt
flask
supervisord 管理的程序
[root@hr-vm-10 docker]# cat app/shop-api/supervisord.ini
[program:shop-api]
command=/usr/bin/python2.7 /opt/app.py
process_name=%(program_name)s
autostart=true
user=www
stdout_logfile=/tmp/api.log
stderr_logfile=/tmp/api.error
[program:sshd]
command=/usr/sbin/sshd -D
process_name=%(program_name)s
autostart=true
stderr_logfile=/tmp/ssh.error
supervisord配置文件
[root@hr-vm-10 docker]# grep daemon app/shop-api/supervisord.conf
nodaemon=true ; (start in foreground if true;default false) ps: 關鍵配置.
進行構建生產環境鏡像
[root@hr-vm-10 docker]# docker build -t shopapi:v3 app/shop-api/
[root@hr-vm-10 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myshopapi v3 609cd450ae28 30 minutes ago 447.3 MB
shopapi v2 6781bc1869d6 About an hour ago 447.3 MB
shopapi v1 b757b7e691a4 About an hour ago 447 MB
centos v3 19aa069dff1a About an hour ago 441.4 MB
centos v2 316718447fdc About an hour ago 433.2 MB
centos v1 011d5c16b681 2 hours ago 404.7 MB
mynginx v2 a03c3c8678c2 6 hours ago 401.3 MB
wangfei/mynginx v1 9a18e628ede9 7 hours ago 381.6 MB
docker.io/centos latest 8140d0c64310 7 weeks ago 192.5 MB
docker.io/nginx latest 3448f27c273f 8 weeks ago 109.4 MB
運行這個容器
[root@hr-vm-10 docker]# dockr run --name myshopapi01 -d -p 8088:5000 -p 8022:22 shopapi:v3
6.4 生產實戰2 docker 之 tomcat
[root@hr-vm-14-docker tomcat]# tree
.
├── apache-tomcat-7.0.64.tar.gz
├── Dockerfile
├── jdk1.8.0_60.tar.gz
├── supervisord.conf
└── supervisord.ini
0 directories, 5 files
[root@hr-vm-14-docker tomcat]# cat Dockerfile
# build tomcat
# Base images
FROM wf/centos:base
# Maintainer
MAINTAINER [email protected]
# Create New Diretory
RUN mkdir -p /application/
# Add file
ADD apache-tomcat-7.0.64.tar.gz /application/
# Add 的用法需要註意一下, 當是壓縮文件的時候,會自動解壓, 如果只是單純的復制,用copy
ADD jdk1.8.0_60.tar.gz /application/
ADD supervisord.ini /etc/supervisord.d/
ADD supervisord.conf /etc/supervisord.conf
# Build tomcat and java
# 這裏有一個坑,原先我使用寫到文件裏的方式,然後source,發現不能生效.
ENV JAVA_HOME /application/jdk
ENV CLASSPATH $CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /application/tomcat_8080
ENV PATH $CATALINA_HOME:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
RUN mv /application/apache-tomcat-7.0.64 /application/tomcat_8080
RUN useradd -s /sbin/nologin -M www
RUN chown -R www.www /application/tomcat_8080
RUN ln -s /application/jdk1.8.0_60 /application/jdk
# EXPOSE
EXPOSE 8080
# volume
VOLUME ["/root/ROOT","/application/tomcat_8080/webapps/ROOT/"]
# CMD
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
[root@hr-vm-14-docker tomcat]# cat supervisord.ini
[program:tomcat]
# 這裏有一個梗,根據我查到的資料,tomcat放前臺啟動有二種方式,另外一種是startup.sh && tailf /tomcat_homg/log/catilina.log
command=/application/tomcat_8080/bin/catalina.sh run
process_name=%(program_name)s
autostart=true
user=www
# 日誌輸出很重要
stdout_logfile=/tmp/tomcat.log
stderr_logfile=/tmp/tomcat.error
7. Docker 本地私有倉庫
7.1 使用 Docker Registry
參考鏈接:
https://docs.docker.com/registry/#tldr
註意事項:
- 服務端運行registy,需要配合使用https來上傳鏡像(so 需要搞ssl證書),客戶端默認使用https
- 可以搞個nginx代理用80代理5000
7.2 使用 vmware harbor (推薦)
參考鏈接:
https://github.com/vmware/harbor
安裝文檔:
https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
問題總結:
http://blog.csdn.net/jiangshouzhuang/article/details/53267094
7.3 docker倉庫圖形化工具
https://github.com/vmware/admiral
Docker 基礎知識-入門篇