部署Docker
1.部署docker相關
此章描述在新的服務器上安裝docker容器。
1.1 概述
Docker 是一個開源的應用容器引擎,基於 Go 語言 並遵從 Apache2.0 協議開源。Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
1.2 軟件環境配置
Centos7.0 64位
Vmware workstation 16.1
1.3 安裝docker
1.3.1 yum安裝
CentOS 7(使用 yum 進行安裝)
# step 1: 安裝必要的一些系統工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加軟件源信息
sudo yum-config-manager --add-repo https://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
1.3.2 使用官方安裝腳本自動安裝
安裝命令如下:
curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun
也可以使用國內 daocloud 一鍵安裝命令:
curl -sSL https://get.daocloud.io/docker | sh
1.3.3 手動安裝
卸載舊版本
較舊的 Docker 版本稱為 docker 或 docker-engine 。如果已安裝這些程序,請卸載它們以及相關的依賴項。
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
1.3.4 使用 Docker 倉庫進行安裝
在新主機上首次安裝 Docker Engine-Community 之前,需要設置 Docker 倉庫。之后,您可以從倉庫安裝和更新 Docker。
1、設置倉庫
安裝所需的軟件包。yum-utils 提供了 yum-config-manager ,並且 device mapper 存儲驅動程序需要 device-mapper-persistent-data 和 lvm2。
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
使用以下命令來設置穩定的倉庫。
官方源地址(比較慢)
$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
可以選擇國內的一些源地址:
阿里雲
$ sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
清華大學源
$ sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
2、安裝 Docker Engine-Community
安裝最新版本的 Docker Engine-Community 和 containerd,或者轉到下一步安裝特定版本:
$ sudo yum install docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密鑰,請選是。
有多個 Docker 倉庫嗎?
如果啟用了多個 Docker 倉庫,則在未在 yum install 或 yum update 命令中指定版本的情況下,進行的安裝或更新將始終安裝最高版本,這可能不適合您的穩定性需求。
Docker 安裝完默認未啟動。並且已經創建好 docker 用戶組,但該用戶組下沒有用戶。
要安裝特定版本的 Docker Engine-Community,請在存儲庫中列出可用版本,然后選擇並安裝:
1、列出並排序您存儲庫中可用的版本。此示例按版本號(從高到低)對結果進行排序。
$ yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
2、通過其完整的軟件包名稱安裝特定版本,該軟件包名稱是軟件包名稱(docker-ce)加上版本字符串(第二列),從第一個冒號(:)一直到第一個連字符,並用連字符(-)分隔。例如:docker-ce-18.09.1。
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
啟動 Docker。
$ sudo systemctl start docker
通過運行 hello-world 映像來驗證是否正確安裝了 Docker Engine-Community
$ sudo docker run hello-world
1.4 安裝報錯及解決
錯誤內容
本人安裝時遇到的報錯(具體以實際情況為准)
package docker-ce-3:19.03.2-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed - cannot install the best candidate for the job - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded - package containerd.io-1.2.2-3.el7.x86_64 is excluded - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages) |
原因分析
containerd.io >= 1.2.2-3 ,意思是 containerd.io 的版本必須大於等於 1.2.2-3
解決
更新 containerd.io 的版本
(嘗試添加'--skip-broken'以跳過可卸載的軟件包,或者添加'--nobest'以不僅使用最佳候選軟件包))
1.#下載containerd.io
2.#安裝containerd.io
yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
3.#繼續6.2安裝步驟
重新安裝最新版本的docker
引用:https://www.cnblogs.com/Gdavid/p/13030007.html
1.5 安裝校驗
docker version
顯示如下信息則為安裝成功
[Work-HN-001 ~]$ sudo docker version Client: Docker Engine - Community Version: 19.03.12 API version: 1.40 Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:46:54 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.12 API version: 1.40 (minimum version 1.12) Go version: go1.13.10 Git commit: 48a66213fe Built: Mon Jun 22 15:45:28 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683 |
2、配置openresty
2.1 概述
OpenResty(又稱:ngx_openresty) 是一個基於 nginx的可伸縮的 Web 平台,由中國人章亦春發起,提供了很多高質量的第三方模塊。
OpenResty 是一個強大的 Web 應用服務器,Web 開發人員可以使用 Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊,更主要的是在性能方面,OpenResty可以 快速構造出足以勝任 10K 以上並發連接響應的超高性能 Web 應用系統。360,UPYUN,阿里雲,新浪,騰訊網,去哪兒網,酷狗音樂等都是 OpenResty 的深度用戶。
OpenResty 簡單理解成 就相當於封裝了nginx,並且集成了LUA腳本,開發人員只需要簡單的其提供了模塊就可以實現相關的邏輯,而不再像之前,還需要在nginx中自己編寫lua的腳本,再進行調用了。
2.2 docker部署
2.2.1 拉取鏡像
docker pull sevenyuan/openresty
2.2.2 啟動openresty
docker run -id --name openresty -p 80:80 sevenyuan/openresty
2.2.3 創建掛載目錄
mkdir -p /opt/docker/openresty
2.2.4 將容器內的初始配置拷貝
docker cp openresty:/usr/local/openresty /opt/docker/
2.2.5 刪除 openresty 容器
docker rm -f 容器ID
2.2.6 掛載方式啟動
docker run -id -p 80:80 \
--name openresty --restart always --privileged=true \
-v /opt/docker/openresty/nginx/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \
-v /opt/docker/openresty/nginx/logs:/usr/local/openresty/nginx/logs \
-v /etc/localtime:/etc/localtime \
sevenyuan/openresty
/etc/localtime 是用來描述本機時間
2.2.7 測試是否成功
curl 127.0.0.1
3、配置Nginx
3.1 簡介
Nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP3、SMTP代理服務器;Nginx可以作為一個HTTP服務器進行網站的發布處理,另外Nginx可以作為反向代理進行負載均衡的實現。
3.2 nginx 環境安裝配置
3.2.1 安裝
Centos7環境下安裝:
一、配置 EPEL源
sudo yum install -y epel-release
sudo yum -y update
二、安裝Nginx
sudo yum install -y nginx
安裝成功后,默認的網站目錄為: /usr/share/nginx/html
默認的配置文件為:/etc/nginx/nginx.conf
自定義配置文件目錄為: /etc/nginx/conf.d/
Ubuntu環境下安裝:
#更新源及安裝
apt update && apt install nginx -y
#查看nginx版本
nginx -v
3.2.2 啟動nginx服務
你可以使用以下命令來啟動nginx服務器:
##啟動 nginx 服務
#service nginx start
我們需要通過以下命令來檢查Nginx服務器是否啟動:
#service nginx status
如果是* nginx is running提示,則代表Ngnix服務正常運行。
使用瀏覽器訪問此機器的 IP,看到如下所示的字樣,就代表nginx已經正確被訪問到了。
3.2.3 啟動,停止和重新加載Nginx配置
要啟動nginx,請運行可執行文件。 當nginx啟動后,可以通過使用-s參數調用可執行文件來控制它。 使用以下語法:
#nginx -s signal
信號(signal)的值可能是以下之一:
- stop - 快速關閉服務
- quit - 正常關閉服務
- reload - 重新加載配置文件
- reopen - 重新打開日志文件
例如,要通過等待工作進程完成服務當前請求來停止nginx進程,可以執行以下命令:
#nginx -s quit
注:該命令應該在啟動nginx的同一用戶下執行。
在將重新配置命令的命令發送到nginx或重新啟動之前,配置文件中的更改將不會被應用。 要重新加載配置文件,請執行:
#nginx -s reload
當主進程收到要重新加載配置的信號,它將檢查新配置文件的語法有效性,並嘗試應用其中提供的配置。 如果這是成功的,主進程將啟動新的工作進程,並向舊的工作進程發送消息,請求它們關閉。 否則,主進程回滾更改,並繼續使用舊配置。 老工作進程,接收關閉命令,停止接受新連接,並繼續維護當前請求,直到所有這些請求得到維護。 之后,舊的工作進程退出。
還可以借助Unix工具(如kill utility)將信號發送到nginx進程。 在這種情況下,信號直接發送到具有給定進程ID的進程。 默認情況下,nginx主進程的進程ID寫入目錄/usr/local/nginx/logs或/var/run中的nginx.pid。 例如,如果主進程ID為1628,則發送QUIT信號導致nginx的正常關閉,請執行:
#kill -s QUIT `pidof nginx`
要獲取所有運行的nginx進程的列表,可以使用ps命令,例如,以下列方式:
#ps -ax | grep nginx
4、配置MySQL
4.1 簡介
MySQL 是最流行的關系型數據庫管理系統,由瑞典MySQL AB公司開發,目前屬於Oracle公司。
MySQL所使用的SQL語言是用於訪問數據庫的最常用標准化語言。
MySQL由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇MySQL作為網站數據庫。
本教程的系統平台:CentOS release 6.6 (Final) 64位。
4.2 安裝編譯工具及庫文件
yum -y install gcc gcc-c++ make autoconf libtool-ltdl-devel gd-devel freetype-devel libxml2-devel libjpeg-devel libpng-devel openssl-devel curl-devel bison patch unzip libmcrypt-devel libmhash-devel ncurses-devel sudo bzip2 flex libaio-devel
4.3 安裝cmake 編譯器
cmake 版本:cmake-3.1.1。
1、下載地址:http://www.cmake.org/files/v3.1/cmake-3.1.1.tar.gz
$ wget http://www.cmake.org/files/v3.1/cmake-3.1.1.tar.gz
2、解壓安裝包
$ tar zxvf cmake-3.1.1.tar.gz
3、進入安裝包目錄
$ cd cmake-3.1.1
4、編譯安裝
$ ./bootstrap
$ make && make install
4.4 安裝 MySQL
MySQL版本:mysql-5.6.15。
1、下載地址: http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz
2、解壓安裝包
$ tar zxvf mysql-5.6.15.tar.gz
3、進入安裝包目錄
$ cd mysql-5.6.15
4、編譯安裝
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_INNODB_MEMCACHED=1 -DWITH_DEBUG=OFF -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DENABLED_PROFILING=ON -DMYSQL_MAINTAINER_MODE=OFF -DMYSQL_DATADIR=/usr/local/webserver/mysql/data -DMYSQL_TCP_PORT=3306
$ make && make install
5、查看mysql版本:
$ /usr/local/webserver/mysql/bin/mysql --version
到此,mysql安裝完成。
4.5 MySQL 配置
4.5.1 創建mysql運行使用的用戶mysql:
$ /usr/sbin/groupadd mysql
$ /usr/sbin/useradd -g mysql mysql
4.5.2 創建binlog和庫的存儲路徑並賦予mysql用戶權限
$ mkdir -p /usr/local/webserver/mysql/binlog /www/data_mysql
$ chown mysql.mysql /usr/local/webserver/mysql/binlog/ /www/data_mysql/
4.5.3 創建my.cnf配置文件
將/etc/my.cnf替換為下面內容
$ cat /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
replicate-ignore-db = mysql
replicate-ignore-db = test
replicate-ignore-db = information_schema
user = mysql
port = 3306
socket = /tmp/mysql.sock
basedir = /usr/local/webserver/mysql
datadir = /www/data_mysql
log-error = /usr/local/webserver/mysql/mysql_error.log
pid-file = /usr/local/webserver/mysql/mysql.pid
open_files_limit = 65535
back_log = 600
max_connections = 5000
max_connect_errors = 1000
table_open_cache = 1024
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 1M
join_buffer_size = 1M
thread_cache_size = 600
#thread_concurrency = 8
query_cache_size = 128M
query_cache_limit = 2M
query_cache_min_res_unit = 2k
default-storage-engine = MyISAM
default-tmp-storage-engine=MYISAM
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 128M
max_heap_table_size = 128M
log-slave-updates
log-bin = /usr/local/webserver/mysql/binlog/binlog
binlog-do-db=oa_fb
binlog-ignore-db=mysql
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 8M
max_binlog_size = 1G
relay-log-index = /usr/local/webserver/mysql/relaylog/relaylog
relay-log-info-file = /usr/local/webserver/mysql/relaylog/relaylog
relay-log = /usr/local/webserver/mysql/relaylog/relaylog
expire_logs_days = 10
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
myisam_sort_buffer_size = 128M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
interactive_timeout = 120
wait_timeout = 120
skip-name-resolve
#master-connect-retry = 10
slave-skip-errors = 1032,1062,126,1114,1146,1048,1396
#master-host = 192.168.1.2
#master-user = username
#master-password = password
#master-port = 3306
server-id = 1
loose-innodb-trx=0
loose-innodb-locks=0
loose-innodb-lock-waits=0
loose-innodb-cmp=0
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0
loose-innodb-cmpmem=0
loose-innodb-cmpmem-reset=0
loose-innodb-buffer-page=0
loose-innodb-buffer-page-lru=0
loose-innodb-buffer-pool-stats=0
loose-innodb-metrics=0
loose-innodb-ft-default-stopword=0
loose-innodb-ft-inserted=0
loose-innodb-ft-deleted=0
loose-innodb-ft-being-deleted=0
loose-innodb-ft-config=0
loose-innodb-ft-index-cache=0
loose-innodb-ft-index-table=0
loose-innodb-sys-tables=0
loose-innodb-sys-tablestats=0
loose-innodb-sys-indexes=0
loose-innodb-sys-columns=0
loose-innodb-sys-fields=0
loose-innodb-sys-foreign=0
loose-innodb-sys-foreign-cols=0
slow_query_log_file=/usr/local/webserver/mysql/mysql_slow.log
long_query_time = 1
[mysqldump]
quick
max_allowed_packet = 32M
4.5.4 初始化數據庫
$/usr/local/webserver/mysql/scripts/mysql_install_db --defaults-file=/etc/my.cnf --user=mysql
顯示如下信息:
Installing MySQL system tables...2015-01-26 20:18:51 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
OK
Filling help tables...2015-01-26 20:18:57 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
OK
...
4.5.5 創建開機啟動腳本
$ cd /usr/local/webserver/mysql/
$ cp support-files/mysql.server /etc/rc.d/init.d/mysqld
$ chkconfig --add mysqld
$ chkconfig --level 35 mysqld on
4.5.6 啟動mysql服務器
$ service mysqld start
4.5.7 連接 MySQL
$ /usr/local/webserver/mysql/bin/mysql -u root -p
4.5.8 修改MySQL用戶密碼
mysqladmin -u用戶名 -p舊密碼 password 新密碼
或進入mysql命令行
SET PASSWORD FOR '用戶名'@'主機' = PASSWORD(‘密碼');
創建新用戶並授權:
grant all privileges on *.* to 用戶名@'%' identified by '密碼' with grant option;
4.6 其他命令
啟動:#service mysqld start
停止:#service mysqld stop
重啟:#service mysqld restart
重載配置:#service mysqld reload
轉載自:https://www.runoob.com/linux/mysql-install-setup.html
5、鏡像的獲取與容器的使用
# 搜索鏡像
docker search <image> # 在docker index中搜索image
# 下載鏡像
docker pull <image> # 從docker registry server 中下拉image
# 查看鏡像
docker images # 列出images
docker images-a # 列出所有的images(包含歷史)
docker rmi <image ID>: # 刪除一個或多個image
# 使用鏡像創建容器
docker run -i -t sauloal/ubuntu14.04
docker run -i -t sauloal/ubuntu14.04 /bin/bash # 創建一個容器,讓其中運行 bash 應用,退出后容器關閉
docker run -itd --name centos_aways --restart=always centos #創建一個名稱centos_aways的容器,自動重啟
# --restart參數:always始終重啟;on-failure退出狀態非0時重啟;默認為,no不重啟
# 查看容器
docker ps :列出當前所有正在運行的container
docker ps -l :列出最近一次啟動的container
docker ps -a :列出所有的container(包含歷史,即運行過的container)
docker ps -q :列出最近一次運行的container ID
# 再次啟動容器
docker start/stop/restart <container> #:開啟/停止/重啟container
docker start [container_id] #:再次運行某個container (包括歷史container)
#進入正在運行的docker容器
docker exec -it [container_id] /bin/bash
docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部訪問容器內服務,host_port 可以省略,省略表示把 container_port 映射到一個動態端口。
# 刪除容器
docker rm <container...> #:刪除一個或多個container
docker rm `docker ps -a -q` #:刪除所有的container
docker ps -a -q | xargs docker rm #:同上, 刪除所有的container
docker run 和 docker create 參數基本一樣,run是創建容器並后台啟動,create是只創建容器。
docker run 相當於docker create 和 docker start
run創建容器:docker run -itd
create創建: docker create -it
-t, --tty Allocate a pseudo-TTY
-i, --interactive Keep STDIN open even if not attached
-d, --detach Run container in background and print container ID #run的參數
容器資源限制參數
-m 1024m --memory-swap=1024m # 限制內存最大使用(bug:超過后進程被殺死)
--cpuset-cpus="0,1" # 限制容器使用CPU
docker容器隨系統自啟參數
docker run --restart=always redis
no – 默認值,如果容器掛掉不自動重啟
on-failure – 當容器以非 0 碼退出時重啟容器
同時可接受一個可選的最大重啟次數參數 (e.g. on-failure:5).
always – 不管退出碼是多少都要重啟
docker run -itd --name test01 -p IP:sport:dport -m 1024m --memory-swap=1024m --cpuset-cpus="0,1" --restart=always <image ID>
docker exec -it test01 bash # 進入容器也可以用exec命令
查看容器狀態信息
[root@localhost ~]# docker stats
[root@localhost ~]# docker stats --no-stream
5.1.1 啟動 docker
[root@chaols ~]# systemctl start docker
5.1.2 查看 docker 鏡像
剛剛安裝docker是沒有鏡像的
[root@chaols ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
5.1.3 下載 centos 鏡像
[root@chaols ~]# docker pull centos
默認centos鏡像沒有ifconfig
5.1.4 自定義 dockerfile 文件
FROM centos
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum install -y net-tools
RUN yum install -y vim
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end-----"
CMD /bin/bash"
5.1.5 開始制作
docker build -f ./dockerfile_chao_centos -t chao.centos:0.1 .
5.1.6 創建虛擬機
root@chaols ~]# docker run -it --name test chao.centos:0.1 /bin/bash
5.1.7 驗證 ifconfig
[root@f5be14eebc1e local]# ifconfig
eth0: flags=4163mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 6 bytes 516 (516.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
5.2 進入容器 - nsenter 命令
5.2.1 nsenter安裝
nsenter 工具在 util-linux 包2.23版本后包含。 如果系統中 util-linux 包沒有該命令,可以按照下面的方法從源碼安裝。
cd /usr/src ; wget https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.tar.gz
./configure --without-ncurses
make nsenter && sudo cp nsenter /usr/local/bin
5.2.2 nsenter使用
nsenter 可以訪問另一個進程的名字空間。nsenter 要正常工作需要有 root 權限。為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通過這個 PID,就可以連接到這個容器:
nsenter --target $PID --mount --uts --ipc --net --pid
更簡單的,建議下載 .bashrc_docker,並將內容放到 .bashrc 中。
wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;
echo "[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker" >> ~/.bashrc; source ~/.bashrc
這個文件中定義了很多方便使用 Docker 的命令,例如 docker-pid 可以獲取某個容器的 PID;而
docker-enter 可以進入容器或直接在容器內執行命令。
echo $(docker-pid <container>)
docker-enter <container> ls
docker-enter <container> bash
5.3 持久化容器與鏡像
5.3.1 通過容器生成新的鏡像
運行中的鏡像稱為容器。你可以修改容器(比如刪除一個文件),但這些修改不會影響到鏡像。不過,你使用docker commit 命令可以把一個正在運行的容器變成一個新的鏡像。
docker commit <container> [repo:tag] # 將一個container固化為一個新的image,后面的repo:tag可選。
5.3.2 持久化容器
export命令用於持久化容器
docker export <CONTAINER ID> > /tmp/export.tar
5.3.3 持久化鏡像
Save命令用於持久化鏡像
docker save 鏡像ID > /tmp/save.tar
5.3.4 導入持久化container
刪除container 2161509ff65e
docker rm 2161509ff65e
導入export.tar文件
cat /tmp/export.tar | docker import - export:latest
5.3.5 導入持久化image
刪除image daa11948e23d
docker rmi daa11948e23d
導入save.tar文件
docker load < /tmp/save.tar
對image打tag
docker tag daa11948e23d load:tag
5.4 export-import與save-load的區別
導出后再導入(export-import)的鏡像會丟失所有的歷史,而保存后再加載(save-load)的鏡像沒有丟失歷史和層(layer)。這意味着使用導出后再導入的方式,你將無法回滾到之前的層(layer),同時,使用保存后再加載的方式持久化整個鏡像,就可以做到層回滾。(可以執行docker tag 來回滾之前的層)。
5.5 一些其它命令
docker logs $CONTAINER_ID #查看docker實例運行日志,確保正常運行
docker inspect $CONTAINER_ID #docker inspect <image|container> 查看image或container的底層信息
docker build <path> 尋找path路徑下名為的Dockerfile的配置文件,使用此配置生成新的image
docker build -t repo[:tag] 同上,可以指定repo和可選的tag
docker build - < <dockerfile> 使用指定的dockerfile配置文件,docker以stdin方式獲取內容,使用此配置生成新的image
docker port <container> <container port> 查看本地哪個端口映射到container的指定端口,其實用docker ps 也可以看到
5.6 docker文件存放目錄
Docker實際上把所有東西都放到/var/lib/docker路徑下了。
[root@localhost docker]# ls -F
containers/ devicemapper/ execdriver/ graph/ init/ linkgraph.db repositories-devicemapper volumes/
containers目錄當然就是存放容器(container)了,graph目錄存放鏡像,文件層(file system layer)存放在graph/imageid/layer路徑下,這樣我們就可以看看文件層里到底有哪些東西,利用這種層級結構可以清楚的看到文件層是如何一層一層疊加起來的。
5.7 docker使用小技巧
5.7.1 清理全部停止的docker容器
有時候我們會有很多已經停止的容器或者由於錯誤強制退出不能用的容器,那我們就需要刪除了,但是我們一個一個的rm刪除很麻煩,有多少容器就要rm多少次,我們可以根據docker ps -qa 查出所有容器的id,一次性全部刪除,不用擔心會刪除正在運行的容器,運行中的容器rm無法刪除,這樣我們就一次性把所有停止的容器刪除了
# 只適用於Linux環境下
docker rm $(docker ps -qa)
5.7.2 查看鏡像中得環境變量
當我們制作好一個鏡像或者獲取到一個鏡像之后如果我們想知道他的環境變量,我們首先想到的就是創建容器看看就知道了,其實不必,我們可以直接通過env查看
docker run nginx env
Windows上和Linux的區別
這兩種環境的區別主要原因還是docker的支持問題,我們都知道docker最開始是在Linux上發行的,依賴於Linux內核,但是Windows上沒有,那么我們現在是怎么用的呢,虛擬機,如果是win10以下版本基本上裝的都是VirtualBox,win10的很多都會選擇桌面版的,使用的Hyper-V ,也是虛擬機的一種。只有有了虛擬機之后docker才能在windows上使用,到這里我們應該知道兩種不同之處了
在Linux上docker直接就在Linux系統上的,但是在windows上不同,windows系統上是虛擬機,虛擬機上才是docker
Linux系統 << docker容器
win系統 << 虛擬機 << docker容器
也就是這種原因,導致我們在使用的過程中有略微的不同,最常見的就是開端口的時候
Linux系統:docker容器端口直接映射到Linux系統
windows系統:docker容器端口映射到虛擬機,再由虛擬機映射到我們的windows
注: 把我們虛擬機中選擇網絡的時候選擇網絡地址轉換(NAT),這樣我們就不用考慮中間虛擬機到windows這層的端口映射問題了
5.7.3 掛載
在使用Docker的時候很多人都喜歡制作鏡像,把應用直接打包到鏡像中,直接啟動鏡像,一切OK,但是避免不了的是我們有時候會做一些細微的修改,特別是配置文件或者是一些項目中微小的修改,這種時候我們還是要重新做鏡像嗎?答案是不需要的,沒有必要
我們前端使用nginx鏡像部署,但是發布之后發現有一點樣式需要微調,那么我們是不是還需要重新制作一個鏡像呢,這樣我們會不會感覺很麻煩(至少我會感覺很麻煩),想想我們只需要把修改過的文件把容器中的文件覆蓋就行了,怎么樣才能直接把修改過的文件覆蓋容器中的文件,兩種辦法:第一直接把文件cp到容器中,這個過程我們還是要操作容器,怎么才能不動容器呢?掛載 我們可以在啟動容器的時候直接把會在后面修改的東西掛載到宿主機上,這樣我們就不用動容器了,啟動的時候使用-v參數掛載宿主機文件或目錄到容器
docker run -d -p 80:80 -v /c/Users/SunArmy/Desktop/html:/usr/share/nginx/html nginx
我們隨便寫一個index.html里面寫上welcome nginx
把這個文件覆蓋/opt/docker/html/下的index.html
再訪問
重啟都不需要直接OK
為什么不選擇直接cp到容器中
有這樣一種情況,如果你需要修改的是配置文件,這肯定是需要重啟的,但是在修改的時候不小心把配置文件寫錯了,這個時候你的容器就起不來了,想要修改容器中的配置,那也做不到了(除非重新創建容器),換種做法,如果我們把配置文件掛載在外面當你啟動不起來的時候你可以直接在宿主機上修改為正確配置重啟啟動即可,綜上,掛載的方式比cp到容器中的方式方便且安全
5.7.4 jq工具
最后介紹一個操作json的工具,這個是在查看容器配置的時候用的,我們使用docker inspect ID查看容器配置,往往會過濾出來一些我們關注的信息,一般情況下我們會選擇docker inspect --format= 或者使用grep
但是無論使用哪一種都沒有我們最熟悉的操作json的方式來過濾用着爽
jq工具需要單獨安裝yum install jq
1、使用jq過濾docker inspect 獲取地址
docker inspect ac |jq -r .[0].NetworkSettings.IPAddress
. 代表管道前面的輸出,之后的[0]就是數組的第1個元素,后面的 . 就是類似於點出對象中的屬性一樣,跟我們平時使用json是一樣的,jq還能方便的格式化查看json文件,對於在命令行下查看json文件簡直是利器
2、修改Docker本地鏡像和容器的存儲位置
很多人都是只知道創建了容器,從來沒有關注過創建的容器在哪?本地鏡像在哪?
但是,當你不得不關注的時候往往就是你的docker鏡像和容器把你的盤裝滿了
查看Docker鏡像和容器存儲的位置
docker info |greo Docker
默認位置就是:/var/lib/docker
修改存儲位置的方法有兩種:
一):通過建立軟連接,把/var/lib/docker 移動到其他地方,建立到這里的軟連接
# 停止docker
service docker stop
# 移動/var/lib/docker 到/usr/local/
mv /var/lib/docker /usr/local/
# 建立軟連接
ln -s /usr/local/docker /var/lib/docker
# 啟動Docker
service docker start
這個時候我們已經修改了,但是查看位置的時候看到的位置還是/var/lib/docker
但是這是個鏈接,可以查看大小發現是空的,真實的存儲位置已經成為了/usr/local/docker
# 查看/var/lib/docker目錄大小
du -dh /var/lib/docker
二):修改配置文件
默認配置文件/etc/docker/daemon.json
如果沒有的話就自己創建
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"graph":"/opt/docker"
}
直接修改 graph 的值為你的位置然后重啟,OK
啟動
service docker stop
停止
service docker start
重啟
service docker restart
再查看docker的存儲位置,已經修改成功
6、示例
6.1 導入docker鏡像
將打包好的鏡像文件從本地通過Xftp上傳至部署服務器,執行導入命令,導入鏡像不分先后順序。
導入命令
cd進入鏡像所在文件夾
sudo docker import - mysql:5.7 < mysql.tar
sudo docker import - redis < redis.tar
sudo docker import - php:7.2-fpm < myphp.tar
sudo docker import - tomcat < tomcat.tar
sudo docker import - resty001 < resty.tar
注意:導入resty鏡像時,’import – resty001’中的鏡像名稱‘resty001’,需要與文件data/openresty/init_docker_openresty.sh初始化腳本中的一致,否則無法啟動。
6.2 查看鏡像
命令:docker images
[Work-HN-001 ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE resty latest d8fe2a29e417 3 days ago 83.2MB tomcat latest c73fb800828c 3 days ago 734MB php 7.2-fpm 621f64d53c17 3 days ago 507MB redis latest cd2429c53c55 3 days ago 94.8MB mysql 5.7 639be76a6d1a 3 days ago 412MB |
6.3 運行docker容器
運行初始化腳本,此腳本不會啟動resty:
./init_docker_container.sh
運行resty初始化腳本,目錄data/openresty:
./ init_docker_openresty.sh
6.4 查看容器
命令:docker ps
輸入后顯示的列名及說明如下:
CONTAINER ID: 容器 ID。
IMAGE: 使用的鏡像。
COMMAND: 啟動容器時運行的命令。
CREATED: 容器的創建時間。
STATUS: 容器狀態。
PORTS: 端口
NAMES: 容器名
容器正在運行,未停止為正常狀態。
6.4.1 查看容器IP及配置
先查詢容器IP將ip配置到對應的文件位置中;
命令:docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat8080
6.4.2 配置tomcat的ip
配置文件位置:/data/openresty/conf.d/01default.conf
172.17.0.6,配置8080端口
6.4.3 配置php的ip
配置文件位置:/data/openresty/conf.d/01default.conf
172.17.0.2,配置9000端口
6.4.4 配置redis的ip
配置文件位置:
/data/tomcat8080/webapps/cims/WEB-INF/classes/application.yml
172.17.0.5
新增加添加下面地址,或直接使用最新文件
application.yml文件最底下加上物聯網視頻監控地址
httpRtmpUrls: http://127.0.0.1:8080/flv?app=live&stream=
6.4.5 配置mysql的ip
配置文件位置:
/data/tomcat8080/webapps/cims/WEB-INF/classes/application-druid.yml
172.17.0.3,端口3306
6.4.6 配置服務器的ip
配置文件位置:/data/openresty/conf.d/01default.conf
配置文件兩處配置服務器的ip:47.112.177.142
6.5 重啟docker服務
輸入命令:./restart_lnmp.sh
等待重啟完成后,登錄服務器地址,查看項目正常運行:
http://服務器ip/cims/v3/#/login
7.Docker 容器配置獨立IP
一般安裝docker后都會通過端口轉發的方式使用網絡,比如 “-p 2294:22” 就將2294抓發到22端口來提供sftp服務,這樣使用起來沒有問題。但端口號很難記憶,如果前邊有nginx等抓發工具,可以將2294再轉回22,但有沒有方法直接給docker容器配置獨立ip地址呢?
以下兩種方式都需要安裝pipework
其作用是指定物理網段容器IP地址
1 2 3 4 5 6 |
cd /usr/src # 若沒有wget命令,安裝 yum install -y wget wget -O pipework-master.zip https://codeload.github.com/jpetazzo/pipework/zip/master # 若沒有unzip命令,安裝 yum install -y unzip zip unzip pipework-master.zip cp -p pipework-master/pipework /usr/local/bin/ |
以下兩個種方式重啟后ip地址都會丟失,所以每次重啟后都要重新分配ip地址
7.1 通過虛擬網卡br0橋接
7.1.1 修改宿主機物理網卡配置
1 |
vi /etc/sysconfig/network-scripts/ifcfg-em1 |
修改兩個配置
1 2 |
BOOTPROTO=none # 配置不啟動dhcp BRIDGE=br0 # 配置網橋 |
7.1.2 增加網橋設備 br0
1 |
vi /etc/sysconfig/network-scripts/ifcfg-br0 |
在其中增加如下內容
1 2 3 4 |
DEVICE=br0 ONBOOT=yes TYPE=Bridge BOOTPROTO=dhcp |
配置完成后重新啟動網絡,此時 br0 設備就使用的物理網卡 em1 作為橋接通信。
7.1.3 創建容器(創建了一個centos7的容器)
1 |
docker run -itd --net=none --name=test01 ansible/centos7-ansible /bin/bash # 其中 --net=none不設置網絡 |
7.1.4 給創建的容器制定物理IP地址
1 2 |
pipework br0 test01 192.168.2.235/24@192.168.2.1 # 網橋 容器名 IP地址 網關地址 |
7.1.5 進入容器查看ip地址
1 2 3 |
docker exec -it test01 /bin/bash # 進入test01容器 yum install -y net-tools # 安裝ifconfig ifconfig |
此時就應該看到配置的 192.168.2.235 這個ip。
此種方法的問題是,之后每個容器都需要指定一個ip地址。
7.2 通過物理網卡橋接
7.2.1 綁定物理ip
1、創建容器(創建了一個centos7的容器)
1 |
docker run -itd --net=none --name=test02 ansible/centos7-ansible /bin/bash # 其中 --net=none不設置網絡 |
2、給創建的容器制定物理IP地址,其中eth0跟據實際情況修改
1 2 |
pipework eth0 test02 192.168.2.234/24@192.168.2.1 # 網橋 容器名 IP地址 網關地址 |
3、進入容器查看ip地址
1 2 3 |
docker exec -it test02 /bin/bash # 進入test01容器 yum install -y net-tools # 安裝ifconfig ifconfig |
此時就應該看到配置的 192.168.2.234 這個ip。
此種方法的問題是,之后每個容器都需要指定一個ip地址。
7.2.2 使用內網地址172.x.x.x
1、創建容器(創建了一個centos7的容器)
1 |
docker run -itd --name=test03 ansible/centos7-ansible /bin/bash |
2、進入容器查看ip地址
1 2 3 |
docker exec -it test03 /bin/bash # 進入test01容器 yum install -y net-tools # 安裝ifconfig ifconfig |
7.2.3 重啟后固定ip
以上防范重啟后需要使用shell腳本的方式重新分配ip地址,也可使用 docker-static-ip 固定ip。實現與pipework一樣,只是用Python把整個指定的IP的操作變成后台進程,把 [容器,網橋,IP地址,網關]寫進containers.cfg 。
程序會根據配置文件來自動設置容器的IP地址,每10秒檢查一次,如果有新增的就會自動設置。
當重啟容器時,IP地址消失,程序會根據配置文件再次自動分配。
8、Docker服務報錯
8.1 Cannot connect to the Docker datemon
1、現象:
重啟docker服務報錯如下:
systemctl restart docker.service
Cannot connect to the Docker datemon at tcp://0.0.0.0:2375 is the docker daemon runing?
2、解決方案:
只能重啟下網卡,然后把docker文件全部干掉,這是我當時能想到的解決方案了,自己做開發測試還好,生產千萬別亂搞。(注:此方案為最終解決方案,使用此方案時,一定要參考其他方案能不能解決你的問題)
service network restart
重新開機,然后刪除docker安裝包(注:做如下操作時,一定要提前備份,不然你docker容器中數據會全部丟失)
rm -rf /var/lib/docker
然后重新安裝下docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce
為避免再次出現問題,我們做如下配置
配置DOCKER_HOST
sudo vim /etc/profile.d/docker.sh
添加下面內容:
export DOCKER_HOST=tcp://localhost:2375
使配置文件生效
source /etc/profile
source /etc/bashrc
配置啟動文件
sudo vim /lib/systemd/system/docker.service
修改下面語句
ExecStart=/usr/bin/dockerd -H unix://
修改為:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
重載配置和重啟
sudo systemctl daemon-reload
sudo systemctl restart docker.service
查看
docker version
說明已經正常。
8.2 Error response from daemon: OCI runtime create failed
1、現象:
docker: Error response from daemon: OCI runtime create failed
2、解決方案:
在新服務器上安裝好docker后,發現無法運行,經常一頓搜索后,發現是docker安裝的版本過高,最新版本docker-18.06 的核心好像沒有經過充分的測試就發布了。
導致一運行,就提示:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused "exit status 23"": unknown.
查看內核版本
root@ebs-25698:~# docker-runc --version
runc version 1.0.0-rc5+dev.docker-18.06
commit: a592beb5bc4c4092b1b1bac971afed27687340c5
spec: 1.0.0
docker的版本是18.06,進行一個降級版本的操作就可以了。
docker版本降級方法
運行命令:apt-get install docker-ce=17.12.1~ce-0~ubuntu 進行降級,如果無法安裝的話,先apt-get remove docker-ce把docker卸了再裝。
安裝其它版本的話,自行apt-cache policy docker-ce 查看目前可以安裝的版本。
8.3 OCI runtime create failed...process_linux.go:449:
1、現象:
2、解決方案:
這是selinux未關閉所致。關閉即可。
參考文檔:https://www.runoob.com/docker/centos-docker-install.html
https://www.cnblogs.com/reasonzzy/p/11378467.html
https://blog.csdn.net/zhaogot/article/details/114069916
https://www.cnblogs.com/Gdavid/p/13030007.html
https://www.cnblogs.com/seozed/p/10985003.html
https://www.cnblogs.com/xingchong/p/14810237.html
https://www.cnblogs.com/SunArmy/p/11128842.html