參考:爲何須要Docker?html
Docker 是一個開源的應用容器引擎,基於 Go 語言並聽從 Apache2.0 協議開源。java
主要應用場景以下:mysql
環境隔離linux
容器間環境相互獨立,互不影響。相似於虛擬機,但相比於更輕量。Docker 各個容器共享一個操做系統內核,而每個虛擬機都有一套完整的操做系統。spring
總體部署sql
能夠將一整套環境構建爲鏡像,進行總體部署,避免線上線下開發環境帶來的各類問題,同時也極大地提升了部署效率,再也不須要重複配置開發環境。docker
Docker 的三個重要概念:ubuntu
鏡像(Image)centos
至關於一個操做系統模板,好比官方鏡像 mysql 就包含了一套完整的操做系統。安全
容器(Container)
容器是鏡像運行的實體,比如於 Java 中對象是類的實例。容器能夠被建立、啓動、暫停和中止等。
倉庫(Repository)
保存鏡像的倉庫,比如於 Maven 倉庫用來保存依賴的 Jar 包。
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程 API 來管理和建立 Docker 容器。
Docker_Client
經過命令行與 Docker daemon(守護進程)通訊。
Docker_Host
用於執行 Docker daemon 的主機。
Registry
Docker 倉庫,一個 Registry 能夠包含多個 Repository 倉庫。
yum remove docker docker-common docker-selinux docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
可能因爲版本緣由提示 requires containerd.io >= 1.2.2-3,先手動安裝新版 containerd.io:
wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
而後從新執行 Docker 安裝命令便可。
systemctl start docker && systemctl enable docker
docker version
運行 bash 命令;
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
而後重啓 docker 服務;
systemctl daemon-reload && systemctl restart docker
修改 docker 服務腳本:
vi /lib/systemd/system/docker.service
在 ExecStart=/usr/bin/dockerd
這一行的後面添加:
-H tcp://0.0.0.0:2375
而後重啓 docker 服務:
systemctl daemon-reload && systemctl restart docker
驗證操做結果:
curl http://localhost:2375/version
上述開放遠程訪問存在極大的安全隱患,沒有認證受權,可採用 TLS 認證完善;
#建立 Docker TLS 證書 #!/bin/bash #相關配置信息 SERVER="106.13.180.17" PASSWORD="123456" COUNTRY="CN" STATE="湖北省" CITY="武漢市" ORGANIZATION="公司名稱" ORGANIZATIONAL_UNIT="Dev" EMAIL="13437104137@qq.com" ###開始生成文件### echo "開始生成文件" #切換到生產密鑰的目錄 cd /etc/docker #生成ca私鑰(使用aes256加密) openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048 #生成ca證書,填寫配置信息 openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL" echo "subjectAltName = IP:$SERVER" >> extfile.cnf echo "extendedKeyUsage = serverAuth" >> extfile.cnf #生成server證書私鑰文件 openssl genrsa -out server-key.pem 2048 #生成server證書請求文件 openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server.csr #使用CA證書及CA密鑰以及上面的server證書請求文件進行簽發,生成server自簽證書 openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile extfile.cnf #生成client證書RSA私鑰文件 openssl genrsa -out key.pem 2048 #生成client證書請求文件 openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo "extendedKeyUsage=clientAuth" > extfile.cnf #生成client自簽證書(根據上面的client私鑰文件、client證書請求文件生成) openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf #更改密鑰權限 chmod 0400 ca-key.pem key.pem server-key.pem #更改密鑰權限 chmod 0444 ca.pem server-cert.pem cert.pem #刪除無用文件 rm client.csr server.csr echo "生成文件完成" ###生成結束###
同時修改 docker 服務腳本:
vi /lib/systemd/system/docker.service
修改ExecStart=/usr/bin/dockerd
這一行爲:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \ --tlsverify \ --tlscacert=/etc/docker/ca.pem \ --tlscert=/etc/docker/server-cert.pem \ --tlskey=/etc/docker/server-key.pem \ -H tcp://0.0.0.0:2376
重啓 docker;
systemctl daemon-reload && systemctl restart docker
鏈接驗證;
docker --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/cert.pem --tlskey=/etc/docker/key.pem -H tcp://106.13.180.17:2376 version
注意服務 IP 填寫本身對應的主機 IP。
docker run hello-world
運行 hello-world 鏡像,先在本地主機查找,不存在則從鏡像倉庫中拉取。
[root@localhost ~]# docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/
參考:Docker 命令大全
docker run ubuntu:15.10 /bin/echo "Hello world"
運行一個 ubuntu 容器,版本號爲 15.10,並執行 /bin/echo "hello world"。
docker exec -it centos /bin/bash
進入一個 name 爲 centos 的容器,而且跳轉到該容器 bash 終端。
-i
交互式操做,一般和 -t 組合使用;
-t
在新容器內指定一個僞終端;
-d
後臺運行;
-e
設置環境變量;
-p
端口映射,主機端口:容器端口
;
ps
獲取容器列表;
run
指定鏡像運行一個容器;
start/stop/restart
啓動、中止或重啓一個容器;
rm
刪除容器;
exec
在容器內執行命令;
logs
獲取容器內的日誌;
images
獲取本地鏡像列表;
rmi
刪除本地鏡像;
部分 <none>:<none> 的鏡像沒有任何引用,能夠經過 docker rmi $(docker images -f "dangling=true" -q) 清除。
一般宿主機和 docker 容器機器時間不一致,可採起外部掛載解決;
-v /etc/localtime:/etc/localtime:ro
建立一個 mysql 容器,映射本機端口 3306 至容器,並初始化密碼爲 123456;
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
每次從新建立 mysql 容器相關數據會被初始化,能夠經過 -v 指定掛載路徑;
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql/data:/var/lib/mysql mysql
進入 mysql 容器 bash 終端交互;
docker exec -it mysql /bin/bash
鏈接 mysql 服務;
mysql -uroot -p123456
執行下面 SQL;
create user 'caojiantao'@'%' identified with mysql_native_password by '123456'; grant all privileges on *.* to 'caojiantao'@'%' with grant option; flush privileges;
若是 docker 遠程鏈接採用 TLS 鏈接,那麼首先將服務器的ca.pem
、cert.pem
和key.pem
三個文件下載到本地D:\docker
目錄,而後如圖設置 docker 鏈接;
新建 Dockerfile 文件,用來構建鏡像,放在項目的根目錄;
FROM java:8 ADD "/target/docker-0.0.1-SNAPSHOT.jar" "app.jar" EXPOSE 8080 ENTRYPOINT [ "java", "-jar", "app.jar" ]
增長鏡像部署配置,注意最底部 Maven 命令,clean package -DskipTests,用來生成構建鏡像須要的 jar 包;
一般須要掛載「項目配置」、「靜態資源」和「服務日誌」幾個目錄,經過 idea 也能很方便的操做,經過上圖中的Bind mounts
設置;