容器操作
# 啟動容器
docker start 容器id
# 停止容器
docker stop 容器id
# 文件拷貝
先創(chuàng)建文件 mkdir:文件夾 vi vim touch:文件
# 容器的文件copy到宿主機上(不是在容器內(nèi)部操作)
docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
docker cp 20fd8:/home/lqz.txt /home/lqz.txt
# 宿主機的文件copy到容器中
docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
docker cp ./lqz.txt 20fd894a3f20:/home/lqz.txt
# 查看容器IP地址
docker inspect 容器名稱 # 查看容器的詳細描述 很多
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱(容器ID)
# 在多個容器之間是可以ping通的
# centos:172.17.0.3
# mysql:172.17.0.2
# 刪除容器(刪除已停止的容器)
docker rm 容器id
docker rm `docker ps -a -q`
# 無狀態(tài)的服務
myslq reids
uwsgi+django
應用部署
mysql部署
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 做目錄映射:data文件,配置文件
# 創(chuàng)建文件夾
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
vim /home/mysql/my.cnf
[client]
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
docker run -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 創(chuàng)建庫,創(chuàng)建表,插入數(shù)據(jù)
# 關閉容器,刪除容器,mysql的容器沒了,但是數(shù)據(jù)在宿主機上放著
# 再運行起一個容器,做好目錄映射,數(shù)據(jù)都回來了
redis
# 拉取redis鏡像
docker pull redis
mkdir /root/data
vim /root/redis.conf
bind 0.0.0.0
daemonize NO
protected-mode no
requirepass 123456
# 運行
docker run -id -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis redis-server /etc/redis/redis.conf
# 遠程鏈接redis操作
redis.conf 文件 刪了再重新搞 通過該文件跑在前臺 一直運行
nginx
# 拉取nginx鏡像
docker pull nginx
# run起容器
# docker run -id --name nginx -p 80:80 nginx
# /usr/share/nginx/html
docker run -id --name nginx -p 80:80 -v /root/html:/usr/share/nginx/html nginx
# 以后只需要修改宿主機的/root/html 路徑,看到頁面就是修改后的
遷移與備份
# 容器保存為鏡像
運行一個centos容器
docker run -id --name centos_vim centos:7
在容器中裝vim
docker exec -it 容器ID號 /bin/bash
yum install vim -y
把容器做成鏡像(centos+vim)
docker commit centos_vim centos_vim_image
把centos_vim 容器刪除
docker rm centos_vim
基于新構(gòu)建的鏡像,運行成容器
docker run -id --name centos_vim centos_vim_image:latest
進入到容器中,查看,軟件都在
docker exec -it 容器ID號 /bin/bash
# 鏡像備份和恢復
docker save -o centos_vim_image.tar centos_vim_image
刪除容器,刪除鏡像
把備份的鏡像恢復
docker load -i centos_vim_image.tar
Dockerfile
# 鏡像從哪里來的?
1 遠程倉庫拉取的 docker pull
2 用容器做成的鏡像 docker commit
3 把備份的恢復 docker load
4 使用Dockerfile來構(gòu)建
# 什么是Dockerfile
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本文件,這些命令應用于基礎鏡像并最終創(chuàng)建一個新的鏡像
# Dockerfile的命令
FROM 基礎鏡像 #基于哪個基礎鏡像來構(gòu)建
MAINTAINER lqz # 聲明鏡像的創(chuàng)建者
ENV key value # 設置環(huán)境變量 (可以寫多條)
RUN command #是Dockerfile的核心部分(可以寫多條)
ADD source_dir/file dest_dir/file #將宿主機的文件復制到容器內(nèi),如果是一個壓縮文件,將會在復制后自動解壓
COPY source_dir/file dest_dir/file # 和ADD相似,但是如果有壓縮文件并不能解壓
WORKDIR path_dir # 設置工作目錄,運行起這個容器,來到的路徑就是這個路徑
# 構(gòu)建一個帶vim的centos鏡像
vim Dockerfile
FROM centos:7
MAINTAINER lqz
ENV name lqz
RUN yum install vim -y
RUN mkdir /lqz
RUN touch /lqz/ss.py
RUN echo 'print(1)' >/lqz/ss.py
COPY /root/redis.conf /lqz/redis.conf
WORKDIR /lqz
# 基于dockerfile構(gòu)建鏡像
docker build -t='centos_lqz_vim' .
# 基于這個鏡像運行容器
docker run -id --name xx centos_lqz_vim
# 進入到容器
docker exec -it xx /bin/bash
# 驗證vim,和文件夾,文件是否存在
常用和不常用的命令
FROM: 指定基礎鏡像
RUN: 構(gòu)建鏡像過程中需要執(zhí)行的命令。可以有多條。docker build
CMD:添加啟動容器時需要執(zhí)行的命令。多條只有最后一條生效??梢栽趩尤萜鲿r被覆蓋和修改。
ENTRYPOINT:同CMD,但這個一定會被執(zhí)行,不會被覆蓋修改。
MLABELAINTAINER:表明鏡像的作者。將被遺棄,被LABEL代替。
EXPOSE:設置對外暴露的端口。
ENV:設置執(zhí)行命令時的環(huán)境變量,并且在構(gòu)建完成后,仍然生效
ARG:設置只在構(gòu)建過程中使用的環(huán)境變量,構(gòu)建完成后,將消失
ADD:將本地文件或目錄拷貝到鏡像的文件系統(tǒng)中。能解壓特定格式文件,能將URL作為要拷貝的文件
COPY:將本地文件或目錄拷貝到鏡像的文件系統(tǒng)中。
VOLUME:添加數(shù)據(jù)卷
USER:指定以哪個用戶的名義執(zhí)行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:設置工作目錄
ONBUILD:如果制作的鏡像被另一個Dockerfile使用,將在那里被執(zhí)行Docekrfile命令
STOPSIGNAL:設置容器退出時發(fā)出的關閉信號。
HEALTHCHECK:設置容器狀態(tài)檢查。
SHELL:更改執(zhí)行shell命令的程序。Linux的默認shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。
dockerfile構(gòu)建一個django項目
# 公司中,使用Docker開發(fā)的工作流程
第一步:有一個項目,pycharm開發(fā)著,開發(fā)完后
第二步:在項目路徑下新建Dockerfile,寫入
FROM python:3.8
MAINTAINER lqz
WORKDIR /soft
COPY ./requirements.txt /soft/requirements.txt
RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple
CMD ["python","manage.py","runserver","0.0.0.0:8080"]
第三步:把代碼提交到git
------------------
第四步:上線人員:在上線機器上,把代碼啦下來
git clone https://gitee.com/liuqingzheng/books.git
第五步:構(gòu)建鏡像
docker build -t='django_books' .
第六步:運行容器
docker run -id --name=books -v /root/lqz/books:/soft -p 8080:8080 django_books:latest
第七步:其它人訪問宿主機的8080端口就能看到項目了
---------
第八步:開發(fā)人員繼續(xù)提交代碼
第九步:運維人員pull代碼,重啟容器,用戶就可以看到最新的了
重啟docker容器即可(第三方依賴變了)--》重寫構(gòu)建鏡像,運行容器
docker私有倉庫
# 有個遠程倉庫 ,docker官方提供的 ---》我們可以把我們的鏡像傳上去
# 公司做的鏡像,一般不放在遠程倉庫,公司會自己搭建私有倉庫(把公司制作的鏡像傳到私有倉庫)
鏡像傳到官方倉庫
# 第0步:在遠端創(chuàng)建倉庫
# 第一步:給鏡像打標簽
docker tag ab5c0e652fd4 liuqingzheng/centos_vim:v1
# 第二步:登錄到遠程
docker login
用戶名:用戶名
密碼:xxx
# 第三步:提交
docker push liuqingzheng/centos_vim:v1
# 第四步:別人就可以下載了
docker pull liuqingzheng/centos_vim:v1
鏡像分層
每一個Dockerfile命令都會構(gòu)建一層鏡像(本質(zhì)上是每一層都會啟動一個容器,執(zhí)行完命令后,將容器進行提交后,產(chǎn)生新的鏡像層。通過查看下載下來的鏡像,發(fā)現(xiàn)歷史層信息的層ID是missing,其實是因為原本的層id只存在于構(gòu)建鏡像的宿主機上,一旦轉(zhuǎn)移鏡像后,歷史層消息中將只保留最新一層的ID
RUN yum install vim -y
RUN yum install git -y
# 查看鏡像分層的命令
docker history liuqingzheng/centos_vim:v1
# 好處:
構(gòu)建快,分發(fā)方便,如果本地有某一層了,這一層就不需要下載了
# 補充:Dcokerfile寫命令,建議多條命令合為一條
RUN python -m pip install --upgrade pip &&\
python -m pip install --upgrade setuptools &&\
pip install -r requirements.txt
私有倉庫搭建
# 自己搭建私有倉庫
harbor:企業(yè)級私有倉庫---》https://blog.csdn.net/Gf19991225/article/details/121982824
registry:用docker搭建私有倉庫
# 搭建步驟:
第一步:拉取鏡像 docker pull registry
第二步:運行容器:docker run -di --name=registry -p 5000:5000 registry
第三步:打開瀏覽器 輸入地址http://47.103.74.128:5000/v2/_catalog看到{"repositories":[]} 表示私有倉庫搭建成功并且內(nèi)容為空
第四步:修改daemon.json
vi /etc/docker/daemon.json
{
"insecure-registries":["47.103.74.128:5000"]
}
第五步:重啟docker 讓配置生效
systemctl restart docker
docker start registry
第六步:把某個鏡像tag成私有倉庫的鏡像
docker tag 鏡像名字/id 47.103.74.128:5000/django_books:v1
第七步:提交到私有倉庫
docker push 47.103.74.128:5000/django_books:v1
第八步:其他人,只要配置了私有倉庫就可以直接拉取
docker pull 47.103.74.128:5000/django_books:v1
dockercompose介紹
# 使用了docker 面臨一個比較大的問題,如果一個djagno項目,使用mysql,redis,不要一次性把所有服務都放到一個容器中,每個服務一個容器,批量的管理多個容器,比較難以操作,于是有了docker-compose
# Docker Compose是一個能一次性定義和管理多個Docker容器的工具,單機容器編排【定義和管理】
# 多機容器編排
-docker swarm:公司里用的不多
-k8s是多機容器編排工具,go語言寫了k8s
Compose中定義和啟動的每一個容器都相當于一個服務(service)
Compose中能定義和啟動多個服務,且它們之間通常具有協(xié)同關系
管理方式:
使用YAML文件來配置我們應用程序的服務。
使用單個命令(docker-compose up),就可以創(chuàng)建并啟動配置文件中配置的所有服務。
# 安裝docker-compose (可執(zhí)行文件,放在了github上,下載下來即可,速度很慢)
# https://github.com/docker/compose/releases
wget https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64
cp ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 以后在任意位置敲docker-compose都可以
# 常用命令
# 啟動管理容器
docker-compose up # 會自動搜索當前路徑下的 docker-compose.yml文件
docker-compose -f 指定文件 up
docker-compose up -d # 后臺執(zhí)行,一般我們看日志輸出,不用這個
docker-compose stop # 停止,不會刪除容器和鏡像
docker-compose down # 停止,并刪除關聯(lián)的容器
docker-compose start # 啟動yml文件管理的容器
docker-compose ps # 正在運行的容器
docker-compose images # docker-compose管理的鏡像
docker-compose exec yml文件中寫的service /bin/bash # 進入到容器內(nèi)
dockercompose部署flask+redis項目
# flask 項目,使用redis服務---》2個容器
新建flask項目app.py
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return '你好! 查看 %s 次\n' % (redis.get('hits'))
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=True)
編寫Dockerfile 用于構(gòu)建flask項目的鏡像
FROM python:3.8
WORKDIR /app
COPY . /app
RUN pip install flask redis -i https://pypi.tuna.tsinghua.edu.cn/simple
EXPOSE 5000
CMD [ "python", "app.py" ]
編寫dockercompose的yml文件dockercompose.yml
version: "3"
services:
redis:
image: redis
web:
build:
context: .
dockerfile: Dockerfile
ports:
8080:5000
environment:
REDIS_HOST: redis
dockercompose啟動
# 如果redis服務的名字叫redis,我在web服務中(容器中),根據(jù)redis名字就能拿到容器
ping redis
# 進入到了web,ping redis
# 安裝ping命令,
apt-get update
apt-get install inetutils-ping
ping redis
# 一鍵部署:redis,和flask ,每個都在一個容器中
docker-compose up
dockercompose一鍵部署luffy項目
# 一臺服務器:
python3.8 環(huán)境 djagno +uwsgi+代碼
nginx軟件
mysql 5.7
redis
# 每個都做成一個容器
djagno項目容器:python3.8 構(gòu)建的django,模塊,uwsgi,代碼
nginx容器:目錄映射,映射到宿主機,代理vue前端,編譯后的靜態(tài)文件
mysql 容器:創(chuàng)建,創(chuàng)用戶,密碼,luffy庫
redis 容器,跑起來即可
# docker-compose yml文件配置,一鍵啟動
git clone https://gitee.com/liuqingzheng/luffy.git
目錄結(jié)構(gòu)
luffy
luffy_api # 后臺項目
Dockerfile
luffycity # 前臺項目
docker_compose_files # 放數(shù)據(jù)的文件夾
docker-compose.yml #ymal文件
docker-compose.yml內(nèi)容
Dockefile 文件
修改前端鏈接后臺的地址:luffycity/src/access/xx.js
編譯:npm run build
提交到git
要部署的服務器:git clone https://gitee.com/liuqingzheng/luffy.git
docker,docker-compose裝好
docker-compose up
訪問宿主機的 80 端口
項目目錄結(jié)構(gòu)
luffy
docker_compose_files # nginx有自己的配置文件,redis自己的配置,mysql的配置
nginx # 文件夾
redis # 文件夾
mysql.env#配置文件
luffy_api # 原來路飛后端項目
Dockerfile
luffy.ini # luffy.xml uwsgi的配置文件
luffycity # 前端項目
docker-compose.yml # docker-compose的配置文件
# 把luffycity/dist 文件夾刪除
# 把\luffy\luffycity\src\assets\js\settings.js后端地址改成上線地址(服務器地址)
# 來到前端路徑下:luffy\luffycity
cnpm install 安裝依賴
# 編譯,在\luffy\luffycity\dist文件夾
npm run build
# 提交到git上
# 在部署的機器上,git clone 下來
# 進入到項目目錄
docker-compose up
luffy_api/Dockerfile 構(gòu)建uwsgi+django
FROM python:3.8
MAINTAINER lqz
WORKDIR /soft
COPY ./requestment.txt /soft/requestment.txt
RUN pip install -r requestment.txt -i https://pypi.doubanio.com/simple
#CMD ["uwsgi", "-x", "./luffy.xml"]
CMD ["uwsgi", "./luffy.ini"]
#CMD ["python", "manage_pro.py", "runserver"]
dockercompose.yml
version: "3"
services:
nginx:
image: nginx
container_name: luffy_nginx
ports:
"80:80"
"8000:8000"
restart: always
volumes:
./luffycity/dist:/var/www/html
./docker_compose_files/nginx:/etc/nginx/conf.d
depends_on:
django
networks:
web
django:
build:
context: ./luffy_api
dockerfile: Dockerfile
container_name: luffy_django
# command: python manage_pro.py makemigrations && python manage_pro.py migrate && uwsgi ./luffy.ini
restart: always
ports:
"8080:8080"
volumes:
./luffy_api:/soft
environment:
TZ=Asia/Shanghai
depends_on:
mysql
redis
networks:
web
redis:
image: redis:6.0-alpine
container_name: luffy_redis
ports:
"6379:6379"
volumes:
./docker_compose_files/redis/data:/data
./docker_compose_files/redis/redis.conf:/etc/redis/redis.conf
command: redis-server /etc/redis/redis.conf
networks:
web
mysql:
image: mysql:5.7
container_name: luffy_mysql
restart: always
ports:
"3306:3306"
env_file:
./docker_compose_files/mysql.env
volumes:
./docker_compose_files/mysql/data:/var/lib/mysql
./docker_compose_files/mysql/logs:/var/log/mysql
./docker_compose_files/mysql/conf:/etc/mysql/conf.d
networks:
web
networks:
web:
一鍵部署
docker-compose up
文章來源地址http://www.zghlxwxcb.cn/news/detail-412534.html
文章來源:http://www.zghlxwxcb.cn/news/detail-412534.html
到了這里,關于docker 容器操作、應用部署、mysql,redis,nginx、遷移與備份、Dockerfile的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!