最近從事公司的新項目,開發一整套雲端系統。因爲公司沒有專門的運維人員,加上以前的項目都是基於線下的delphi系統。我就順便負責前期的環境搭建工做,因爲公司的整個雲系統不單單作雲服務提供給其餘商家使用,還可能作爲解決方案賣給大客戶,須要部署方便,加上雲端的依賴環境主要是mysql,rabbitmq,redis,nginx,php,java。暫定方案使用docker來作環境搭建。php
docker的入門教程蠻多的,我就作簡單介紹一下。我的理解的docker,做爲一種容器的技術,經過從統一的倉庫運輸鏡像到容器去運行,經過linux的底層技術LSC實現隔離,提供統一的API接口方便部署。java
安裝 yum install -y docker 啓動 service docker start 驗證安裝 docker version 因爲網絡問題,可能拉取鏡像的時候很慢,能夠經過設置代理等操做加快,或者自建鏡像倉庫等 貼一下我以前有用到倉庫中心: Docker倉庫 https://hub.docker.com/explore/ 國內:須要登陸 https://cr.console.aliyun.com/#/imageList https://c.163.com/hub#/m/home/
1.docker pull [options] name[:TAG] 拉取鏡像:不加標籤默認獲取latest 2.docker run [options] image[:TAG][COMMAND] 運行鏡像:指令的選項較多,介紹本身日常使用較多的 -d:後臺運行 -p:指定端口端口映射 -P:啓動所有端口映射,須要經過docker ps查看端口映射狀況 -v:文件映射 -e:變量賦值 -m:限制容器的內存上限 --name:容器命名 --restart=always:容器重啓 3.docker ps:查看運行的容器 -a:查看所有,包括已經中止 4.docker exec -it containid bash:進入容器內部 5.docker stats containid:查看容器的運行狀況 6.docker build -t image:tag -f buildfile .:構建鏡像 構建鏡像:有時候咱們須要爲存在的鏡像加入新的插件來從新構建特有的鏡像,經過編寫Dockerfile來構建 貼一個本身構建php的鏡像(基於基礎php加入redis,mq等插件) docker build -t php:5.6-fpm-ext -f ./docker/php/phpDockerfile . phpDockerfile: FROM hub.c.163.com/library/php:5.6-fpm RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libmcrypt-dev libpng12-dev RUN docker-php-ext-install -j$(nproc) iconv mcrypt RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ RUN docker-php-ext-install -j$(nproc) gd RUN docker-php-ext-install mysqli RUN docker-php-ext-install pdo_mysql RUN docker-php-ext-install zip RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/2.2.7.tar.gz \ && tar xfz /tmp/redis.tar.gz \ && rm -r /tmp/redis.tar.gz \ && mkdir -p /usr/src/php/ext \ && mv phpredis-2.2.7 /usr/src/php/ext/redis \ && docker-php-ext-install redis COPY ./docker/php/rabbitmq-c-0.4.1.tar.gz /tmp/rabbitmq-c-0.4.1.tar.gz RUN tar zxvf /tmp/rabbitmq-c-0.4.1.tar.gz \ && curl -L -o /tmp/amqp-1.2.0.tgz http://pecl.php.net/get/amqp-1.2.0.tgz \ && tar zxvf /tmp/amqp-1.2.0.tgz \ && rm -r /tmp/rabbitmq-c-0.4.1.tar.gz \ && rm -r /tmp/amqp-1.2.0.tgz \ && mkdir -p /usr/src/php/ext \ && mv rabbitmq-c-0.4.1 /usr/src/php/ext/rabbitmq \ && mv amqp-1.2.0 /usr/src/php/ext/amqp \ && cd /usr/src/php/ext/rabbitmq \ && ./configure --prefix=/usr/local/rabbitmq-c-0.4.1 \ && make && make install \ && cd /usr/src/php/ext/amqp \ && docker-php-ext-configure amqp --with-php-config=/usr/local/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.4.1/ \ && docker-php-ext-install amqp
防火牆問題: 在一個容器內容調用寧外一個容器的url出現curl:no route to host問題。 經排查:個人centos7防火牆使用了firewalld,firewall的底層是使用iptables進行數據過濾,創建在iptables之上,這可能會與 Docker 產生衝突。 解決:在firewalld中加入容器須要端口 firewall-cmd --zone=public --add-port=80/tcp --permanent:加入80端口 firewall-cmd --reload:重啓防火牆mysql
權限問題: 有時候會出現沒法寫文件等問題。 解決:(最粗暴的方案) 給文件加入chmod 777 -R * docker加入docker run --privileged=truelinux
JAVA內存問題: 使用springboot的時候出現內存吃緊,因爲沒設置jvm的內存大小默認直接使用機器內存的1/4做爲上限,致使內存吃緊,經過加入docker run -m 只是限制容器的內存上限,到達上限以後容器會被停掉,可是不會對jvm的內存有影響,因此要解決應該在啓動容器的時候加入 java -Xmx256m -Xms64m -Xmn32m。固然也能夠經過其餘方案設置jvm,看我的喜愛。nginx
代碼和鏡像打包問題: docker使用的時候,代碼是否須要和鏡像一塊兒構建變成新的鏡像,這種方案可能很美好,構建完,哪裏有須要拉取,運行就好。可是在實際運用過程,業務的代碼是要常常變動的,因此咱們選取的方案是經過-v映射代碼,鏡像以運行環境爲準,不作代碼打入,這樣變動代碼,只需替換文件,無須重構建鏡像。git
數據庫問題: 在咱們的開發和測試docker也作了mysql數據庫,不過看了網絡的一些介紹,說不建議把數據庫使用docker,可能會出現問題。因爲咱們生產環境使用了阿里雲的數據庫,因此暫時沒有發現相關的坑。github
應用問題: docker的容器建立,關閉等經過什麼方式?docker compose,仍是shell? 考慮到要給其餘客戶安裝加上網絡問題,我直接使用shell腳本編寫,沒有使用compose。最後貼一些個人非專業運維的shell腳本。redis
1.docker的網絡介紹,docker有3種網絡類型:spring
Bridge(默認) Host None Bridge:作一個網橋端口映射,容器有獨立ip,端口, Host:容器內網絡和主機網絡同樣
2.docker compose 管理多個容器,經過編寫docker-compose.yaml來定義須要容器sql
安裝: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 查看:docker-compose --version
貼一個docker-compose.yaml
version: '2' services: java: build: . ports: - "8080:8080" volumes: - "./tmp:/tmp" - "./logs:/opt/logs" depends_on: - mysql entrypoint: [ "sh", "-c", "./wait-for-it.sh -h mysql -p 3306 -s -- java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.datasource.url=jdbc:mysql://mysql:3306/mq -jar app.jar" ] mysql: image: daocloud.io/mysql:5.6 environment: MYSQL_DATABASE: mq MYSQL_USER: mq MYSQL_PASSWORD: 123456 MYSQL_ROOT_PASSWORD: 123456
3.docker可視化UI控制檯 經過可視化的頁面來控制容器啓停,運行狀態等。比較流行的有dockerui,Shipyard等,看我的須要。
最後啓動容器的shell腳本:
echo "start docker" service docker start function start_image { if [ $(docker ps -a | grep -c $1) -ge 1 ] then echo "container has exits $1 start" docker start $1 else echo "$1 run image create container" docker run -d -v /etc/localtime:/etc/localtime:ro --privileged=true --name $1 $2 fi } if [ $(docker images hub.c.163.com/library/mysql:5.6 | grep -c hub.c.163.com/library/mysql) -ge 1 ] then start_image cloud-mysql-dev \ "-p 8000:3306 -v ${PWD}/data/mysql:/var/lib/mysql -v ${PWD}/docker/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123cloud hub.c.163.com/library/mysql:5.6" fi if [ $(docker images hub.c.163.com/library/redis:3 | grep -c hub.c.163.com/library/redis) -ge 1 ] then start_image cloud-redis-dev \ "-p 8001:6379 -v ${PWD}/data/redis:/data -v ${PWD}/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf hub.c.163.com/library/redis:3 redis-server /usr/local/etc/redis/redis.conf --appendonly yes " fi