docker-compose 是什么
docker-compose 是一個用來把 docker 自動化的東西。
有了 docker-compose 你可以把所有繁復的 docker 操作全都一條命令,自動化的完成。
為什么要用 docker-compose,他解決了什么
用通俗的語言來說,我們平時操作 docker 還是很原始的一系列動作,你手動使用 docker 的動作可以拆分成
- 找到一個系統鏡像 // docker search
- 安裝好 vm 或者 virtual box // apt-get install docker
- 在 vm 中安裝鏡像 // docker run -d -it 你的鏡像
- 略..
這是最小的動作, 如果你要映射硬盤,設置nat網絡或者橋接網絡,等等…你就要做更多的 docker 操作, 這顯然是非常沒有效率的。
但是我們寫在 docker-compose.file 里面就很好了。 你只需要寫好后 只運行一句docker-compose up
Docker Compose 常用命令與配置
常見命令
- ps:列出所有運行容器
docker-compose ps
- logs:查看服務日志輸出
docker-compose logs
- port:打印綁定的公共端口,下面命令可以輸出 eureka 服務 8761 端口所綁定的公共端口
docker-compose port eureka 8761
- build:構建或者重新構建服務
docker-compose build
- start:啟動指定服務已存在的容器
docker-compose start eureka
- stop:停止已運行的服務的容器
docker-compose stop eureka
- rm:刪除指定服務的容器
docker-compose rm eureka
- up:構建、啟動容器
docker-compose up
- kill:通過發送 SIGKILL 信號來停止指定服務的容器
docker-compose kill eureka
- pull:下載服務鏡像
- scale:設置指定服務運氣容器的個數,以 service=num 形式指定
docker-compose scale user=3 movie=3
- run:在一個服務上執行一個命令
docker-compose run web bash
docker-compose.yml 屬性
- version:指定 docker-compose.yml 文件的寫法格式
- services:多個容器集合
- build:配置構建時,Compose 會利用它自動構建鏡像,該值可以是一個路徑,也可以是一個對象,用於指定 Dockerfile 參數
build: ./dir
---------------
build:
context: ./dir
dockerfile: Dockerfile
args:
buildno: 1
- command:覆蓋容器啟動后默認執行的命令
command: bundle exec thin -p 3000 ---------------------------------- command: [bundle,exec,thin,-p,3000]
- dns:配置 dns 服務器,可以是一個值或列表
dns: 8.8.8.8 ------------ dns: - 8.8.8.8 - 9.9.9.9
- dns_search:配置 DNS 搜索域,可以是一個值或列表
dns_search: example.com ------------------------ dns_search: - dc1.example.com - dc2.example.com
- environment:環境變量配置,可以用數組或字典兩種方式
environment:
RACK_ENV: development
SHOW: 'ture' ------------------------- environment: - RACK_ENV=development - SHOW=ture
- env_file:從文件中獲取環境變量,可以指定一個文件路徑或路徑列表,其優先級低於 environment 指定的環境變量
env_file: .env
---------------
env_file:
- ./common.env
- expose:暴露端口,只將端口暴露給連接的服務,而不暴露給主機
expose:
- "3000" - "8000"
- image:指定服務所使用的鏡像
image: java
- network_mode:設置網絡模式
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
- ports:對外暴露的端口定義,和 expose 對應
ports: # 暴露端口信息 - "宿主機端口:容器暴露端口" - "8763:8763" - "8763:8763"
- links:將指定容器連接到當前連接,可以設置別名,避免ip方式導致的容器重啟動態改變的無法連接情況
links: # 指定服務名稱:別名 - docker-compose-eureka-server:compose-eureka
- volumes:卷掛載路徑
volumes:
- /lib
- /var
- logs:日志輸出信息
--no-color 單色輸出,不顯示其他顏.
-f, --follow 跟蹤日志輸出,就是可以實時查看日志
-t, --timestamps 顯示時間戳
--tail 從日志的結尾顯示,--tail=200
Docker Compose 其它
更新容器
- 當服務的配置發生更改時,可使用 docker-compose up 命令更新配置
- 此時,Compose 會刪除舊容器並創建新容器,新容器會以不同的 IP 地址加入網絡,名稱保持不變,任何指向舊容起的連接都會被關閉,重新找到新容器並連接上去
links
- 服務之間可以使用服務名稱相互訪問,links 允許定義一個別名,從而使用該別名訪問其它服務
version: '2' services: web: build: . links: - "db:database" db: image: postgres
- 這樣 Web 服務就可以使用 db 或 database 作為 hostname 訪問 db 服務了
使用dockers-compose
新建 項目 userapi
添加引用:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
MySql.Data.EntityFrameworkCore
models 新建Users
public class Users { [Key] public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Job { get; set; } public string Company { get; set; } public DateTime CreateTime { get; set; } }
添加AppDbContext
public class AppDbContext : DbContext { public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); } public DbSet<Users> Users { get; set; } }
配置文件添加數據庫連接
"ConnectionStrings": { "MysqlConnection": "server=db;port=3306;database=mysql;userId=root;password=1234." }
Startup
ConfigureServices添加
services.AddDbContext<AppDbContext>(options => { options.UseMySQL(Configuration.GetConnectionString("MysqlConnection")); });
configrue 添加 InitDataBase(app);
private void InitDataBase(IApplicationBuilder app) { using (var scope = app.ApplicationServices.CreateScope()) { var userContext = scope.ServiceProvider.GetRequiredService<AppDbContext>(); userContext.Database.Migrate(); if (userContext.Users != null) { userContext.Users.Add(new Models.Users() { Age = 66, Company = "myCompany", CreateTime = DateTime.Now, Job = "chengxuyuan", Name = "xiaohong" }); userContext.SaveChanges(); } } }
新建 ADD-Migrations init
這里需要注意mysql有的時候不會生成__EFMigrationsHistory表
可以在AppDbContextModelSnapshot 文件里添加
modelBuilder.Entity("__EFMigrationsHistory", b => { b.Property<string>("MigrationId"); b.Property<string>("ProductVersion"); });
也可以自己在mysql中新建
CREATE TABLE `__EFMigrationsHistory` ( `MigrationId` nvarchar(150) NOT NULL, `ProductVersion` nvarchar(32) NOT NULL, PRIMARY KEY (`MigrationId`) );
新建文件Dockerfile.json
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:2.2-stretch AS build WORKDIR /src COPY ["User.Api.csproj", ""] RUN dotnet restore "./User.Api.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "User.Api.csproj" -c Release -o /app FROM build AS publish RUN dotnet publish "User.Api.csproj" -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "User.Api.dll"]
新建文件docker-compose.yml
version: '3.3' services: db: image: mysql/mysql-server container_name: mysqldb command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci restart: always ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: 1234. MYSQL_USER: root MYSQL_PASSWORD: 1234. volumes: - /d/docker/beta/mysql-init:/docker-entrypoint-initdb.d web: build: . container_name: aspnetcore ports: - "8004:80" depends_on: - db
init.sql 添加root 授權,並刷新權限:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1234.'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; flush privileges;
cmd 到項目目錄
執行 : docker-compose up
指定dockers ps
我們看到項目已經發布成功了
瀏覽器看看