Docker備忘錄

 

centOS安裝教程:https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/mysql

1、經常使用命令linux

docker build -t friendlyname .# 使用此目錄的 Dockerfile 建立鏡像
docker run -p 4000:80 friendlyname # 運行端口 4000 到 90 的「友好名稱」映射
docker run -d -p 4000:80 friendlyname # 內容相同,但在分離模式下
docker ps # 查看全部正在運行的容器的列表
docker stop <hash> # 平穩地中止指定的容器
docker ps -a # 查看全部容器的列表,甚至包含未運行的容器
docker kill <hash> # 強制關閉指定的容器
docker rm <hash> # 今後機器中刪除指定的容器
docker rm $(docker ps -a -q) # 今後機器中刪除全部容器
docker images -a # 顯示此機器上的全部鏡像
docker rmi <imagename> # 今後機器中刪除指定的鏡像
docker rmi $(docker images -q) # 今後機器中刪除全部鏡像
docker login # 使用您的 Docker 憑證登陸此 CLI 會話
docker tag <image> username/repository:tag # 標記 <image> 以上傳到鏡像庫
docker push username/repository:tag # 將已標記的鏡像上傳到鏡像庫
docker run username/repository:tag # 運行鏡像庫中的鏡像

 $ sudo systemctl start docker //啓動dockergit

 $ docker run -d -p 27017:27017 --name some-mongo mongo   //啓動容器github

 $shell> docker exec -it mysql1 bash //進入mysql1容器web

 $bash-4.2# mysql -uroot -p   //在mysql1容器執行。進入mysqlsql

 $docker restart mysql01  //重啓容器docker

 service docker start  //啓動容器shell

docker build --rm //build時刪除中間鏡像json

1,設置docker鏡像地址vim

 vim /etc/docker/daemon.json


"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 
}

 

 

2、mysql容器

1,使用mysql的一些問題

建立的mysql的root用戶只能經過本地登陸。這種問題能夠直接把root的host改成0.0.0.0容許任何ip登陸。root是超級用戶,這樣作不安全,通常建議另建立一個用戶:

mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY 'pwd123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;
mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'pwd123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
SELECT plugin FROM mysql.user WHERE User = 'test';
client does not support authentication protocol by server;consider upgrading MYSQL client解決方法

2,容許mysql容器時設置用戶名和密碼和字符集

docker run -d -p 3307:3306 -e MYSQL_USER="hunter" -e MYSQL_PASSWORD="pwd123456" -e MYSQL_ROOT_PASSWORD="pwd213456" --name mysql2 mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci

show variables like "%char%";   //查看字符集

 

3、資料卷掛載

1,使用Volume進行mysql資料卷掛載

①在主機上新建 /docker/mysql/config/my.cnf 文件和 /docker/mysql/data 目錄

在my.conf文件中指定用戶(必須指定,否則會報錯)

[mysqld]
user=mysql
  [mysqld] 
  character-set-server=utf8
  [client]
  default-character-set=utf8
  [mysql]
  default-character-set=utf8
設置編碼格式

 

②啓動mysql

 [root@localhost config]# docker run -d -p 3308:3306 --name mysql3 -v=/docker/mysql/config/my.cnf:/etc/my.cnf -v=/docker/mysql/data:/var/lib/mysql mysql/mysql-server 

將容器中的 /etc/my.cnf 映射到主機的 /docker/mysql/config/my.cnf:/etc/my.cnf 文件。

將容器的 /var/lib/mysql 目錄映射到主機的 /docker/mysql/data 目錄

 

4、鏡像打包

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "demo.dll"]

案例下載:https://pan.baidu.com/s/1DLod4xexm7-_UjJ6A8N-Ug

 

5、容器互聯

docker inspect mysql1 //查看容器網絡

docker inspect network test1_default //查看網絡

docker network create -d bridge my-net  // 新建my-net網絡

docker network ls  //查看網路

docker network connect my-net mysql1  //將運行的容器加入到my-net網絡

docker run -d -p 7001:80 --net my-net --name aspcore1 aspcore:1.1  //啓動容器時加入網絡

yum install -y iputils  //yum安裝ping 

 

6、Docker-Compose

1,基本命令

   ①安裝

$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose

  docker-compose up //該命令十分強大,它將嘗試自動完成包括構建鏡像,(從新)建立服務,啓動服務,並關聯服務相關容器的一系列操做

  docker-compose up -d //後臺啓動

  docker-compose down //此命令將會中止 up 命令所啓動的容器,並移除網絡

2,啓動asp.net core+mysql

version: "3"
services:
  
  db:
    image: mysql/mysql-server
    container_name: db
    #執行mysql命令指定編碼格式
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
    ports: 
      - "3306:3306"
    #指定容器退出後的重啓策略爲始終重啓。該命令對保持服務始終運行十分有效,在生產環境中推薦配置爲 always 或者 unless-stopped。
    restart: always
    environment: 
      MYSQL_USER: hunter
      MYSQL_PASSWORD: pwd123456
      MYSQL_ROOT_PASSWORD: pwd123456
    volumes:
      # 主機/docker/mysql/init目錄映射到mysql容器/docker-entrypoint-initdb.d目錄
      # 啓動時會容許此目錄下的sql腳本
      - /docker/mysql2/init:/docker-entrypoint-initdb.d
      - /docker/mysql2/config/my.cnf:/etc/my.cnf
      - /docker/mysql2/data:/var/lib/mysql
      
  web1:
    depends_on:
      - db
    build: .
    container_name: aspcore1
    ports: 
      - "8002:80"

打包asp.net core鏡像

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out

# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "demo.dll"]
Dockerfile

mysql初始化執行的腳本,設置權限

GRANT ALL PRIVILEGES ON *.* TO 'hunter'@'%' WITH GRANT OPTION;
ALTER USER 'hunter'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
init.sql

使用重試方式,保證在db初始完成以後執行種子命令

using System;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System.Threading;

namespace demo.Data
{
    public class MyDbContextSeed
    {
        
        private ILogger<MyDbContextSeed> _logger;
        public MyDbContextSeed(ILogger<MyDbContextSeed> logger)
        {
            _logger=logger;
        }

        public void Seed(IServiceProvider service,int retry)
        {
            _logger.LogDebug("InSeed");
            try{
                using(var services=service.CreateScope()) 
                {
                    var provider= services.ServiceProvider;
                    var logFactory= services.ServiceProvider.GetService<ILoggerFactory>();
                    var context= provider.GetRequiredService<MyDbContext>();
                    _logger.LogDebug("Migrate_Start");
                    context.Database.Migrate();
                    _logger.LogDebug("Migrate_End");
                    if(!context.Users.Any())
                    {
                        _logger.LogDebug("UserAdd_Start");
                        context.Users.Add(new User(){Password="123456",UserName="hunter"});
                        context.SaveChanges();
                        _logger.LogDebug("UserAdd_End");
                    }
                } 
            }
            catch(Exception ex){
                _logger.LogError("失敗重試:"+retry);
                Thread.Sleep(2000);
                Seed(service,++retry);
            }
               
        }
    }
}
MyDbContextSeed.cs

鏈接字符串server使用的容器名稱

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MysqlConnection": "server=db;port=3306;database=demo1;userid=hunter;password=pwd123456;"
  }
}
appsettings.json

案例下載:https://pan.baidu.com/s/1lAy6pM9uipQnbvGG6A2TYQ

 

7、Gitlab

參考教程:https://docs.gitlab.com/omnibus/docker/#after-starting-a-container

本例使用 GitLab CE  鏡像,若是使用 GitLab EE 將鏡像名稱替換爲 gitlab/gitlab-ee:latest 

gitlab可使用如下三種方式運行

  • 使用docker引擎運行
  • 將gitlab安裝到集羣中
  • 使用docker-compose安裝

運行鏡像

sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

這將下載並啓動GitLab CE容器併發布訪問SSH,HTTP和HTTPS所需的端口。

全部GitLab數據都將存儲爲/srv/gitlab/的子目錄。

restart always:系統重啓後,容器將自動重啓。

您如今能夠按照啓動容器後的說明登陸Web界面。

數據存儲在哪裏?

GitLab容器使用主機安裝的捲來存儲持久數據:

Local location Container location Usage
/srv/gitlab/data /var/opt/gitlab 用於存儲應用數據
/srv/gitlab/logs /var/log/gitlab 用於存儲日誌
/srv/gitlab/config /etc/gitlab 用於存儲GitLab配置文件

 

 

 

 

配置GitLab

此容器使用官方的Omnibus GitLab軟件包,所以全部配置都在惟一的配置文件 /etc/gitlab/gitlab.rb 中完成。

打開/etc/gitlab/gitlab.rb後,確保將 external_url 設置爲指向有效的URL。

要從GitLab接收電子郵件,您必須配置SMTP設置,由於GitLab Docker映像沒有安裝SMTP服務器。

完成所需的全部更改後,須要從新啓動容器才能從新配置GitLab: sudo docker restart gitlab 

預配置Docker容器

您能夠經過將環境變量GITLAB_OMNIBUS_CONFIG添加到docker run命令來預配置GitLab Docker映像。注意:GITLAB_OMNIBUS_CONFIG中包含的設置不會寫入gitlab.rb配置文件

這是一個設置外部URL並在啓動容器時啓用LFS的示例:

sudo docker run --detach \
    --hostname gitlab.example.com \
    --env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
    --publish 443:443 --publish 80:80 --publish 22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

請注意,每次執行docker run命令時,都須要提供GITLAB_OMNIBUS_CONFIG選項。 後續運行之間不保留GITLAB_OMNIBUS_CONFIG的內容。

因爲22端口被佔用我使用的是23。網站端口改成8099

啓動容器後

初始化過程可能須要很長時間。 您可使用命令 sudo docker logs -f gitlab 跟蹤此過程
您第一次訪問GitLab時,系統會要求您設置管理員密碼。 更改後,您可使用用戶名root和您設置的密碼登陸

將GitLab升級到更新版本

要將GitLab升級到新版本,您必須:

一、中止正在運行的容器: sudo docker stop gitlab 

二、刪除現有容器: sudo docker rm gitlab 

三、拉新鏡像: sudo docker pull gitlab/gitlab-ce:latest 

四、使用先前指定的選項再次建立容器:

sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest

在第一次運行時,GitLab將從新配置和更新本身。

在公共IP地址上運行GitLab CE

您能夠經過修改--publish標誌使Docker使用您的IP地址並將全部流量轉發到GitLab CE容器。
在IP 1.1.1.1上公開GitLab CE:

sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 1.1.1.1:443:443 \
    --publish 1.1.1.1:80:80 \
    --publish 1.1.1.1:22:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

而後,您能夠訪問http://1.1.1.1/和https://1.1.1.1/訪問您的GitLab實例

在不一樣的端口上公開GitLab

GitLab默認會佔用容器內的如下端口:

  • 80 (HTTP)
  • 443 (if you configure HTTPS)
  • 8080 (Unicorn使用的)
  • 22 (SSH守護程序使用的)

若是要爲容器使用與80(HTTP)或443(HTTPS)不一樣的端口,則須要在docker run命令中添加單獨的--publish指令。

例如,要在端口8929上公開Web界面,在端口2289上公開SSH服務,請使用如下docker run命令:

sudo docker run --detach \
    --hostname gitlab.example.com \
    --publish 8929:80 --publish 2289:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

而後,您須要適當地配置gitlab.rb:

1,配置  external_url :

# For HTTP
external_url "http://gitlab.example.com:8929"

or

# For HTTPS (notice the https)
external_url "https://gitlab.example.com:8929"

2,配置 gitlab_shell_ssh_port :

gitlab_rails['gitlab_shell_ssh_port'] = 2289

按照上面的示例,您將可以經過<hostIP>:8929下的Web瀏覽器訪問GitLab,並使用端口2289下的SSH進行推送。

能夠在docker-compose部分中找到使用不一樣端口的docker-compose.yml示例

診斷潛在問題

讀取容器日誌: sudo docker logs gitlab 

輸入運行容器: sudo docker exec -it gitlab /bin/bash 

在容器內,您能夠像管理Omnibus安裝同樣管理GitLab容器

使用docker-compose安裝GitLab

使用Docker撰寫,您能夠輕鬆配置,安裝和升級基於Docker的GitLab安裝。

web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.example.com'
      # Add any other gitlab.rb configuration here, each on its own line
  ports:
    - '80:80'
    - '443:443'
    - '22:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'

確保您與docker-compose.yml在同一目錄中並運行docker-compose up -d以啓動GitLab

下面是另外一個docker-compose.yml示例,其中GitLab在自定義HTTP和SSH端口上運行。 注意GITLAB_OMNIBUS_CONFIG變量如何與ports部分匹配:

web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://gitlab.example.com:9090'
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
  ports:
    - '9090:9090'
    - '2224:22'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'

這與使用--publish 9090:9090 --publish 2224:22相同

使用Docker compose更新GitLab

若是你使用docker-compose安裝了GitLab,你所要作的就是運行docker-compose pull和docker-compose up -d來下載新版本並升級你的GitLab實例

將GitLab安裝到羣集中

GitLab Docker鏡像也能夠部署到各類容器調度平臺。

故障排除

1,500內部錯誤

更新Docker鏡像時,您可能會遇到一個問題,其中全部路徑都顯示臭名昭着的500頁。 若是發生這種狀況,請嘗試運行sudo docker restart gitlab重啓容器並糾正問題

2,許可問題

從舊的GitLab Docker映像更新時,您可能會遇到權限問題。 這是由於先前鏡像中的用戶未正確保留。 有修復全部文件權限的腳本。
要修復容器,只需執行update-permissions並在以後從新啓動容器:

sudo docker exec gitlab update-permissions
sudo docker restart gitlab

3,Windows/Mac: Error executing action run on resource ruby_block[directory resource: /data/GitLab]

在Windows或Mac上使用Docker Toolbox和VirtualBox並使用Docker卷時會發生此錯誤。/c/Users卷做爲VirtualBox共享文件夾安裝,不支持全部POSIX文件系統功能。 若是沒有從新掛載,則沒法更改目錄全部權和權限,而且GitLab失敗。

咱們的建議是切換到您的平臺使用本機Docker安裝,而不是使用Docker Toolbox。

若是您沒法使用本機Docker安裝(Windows 10 Home Edition或Windows <10),那麼另外一種解決方案是爲Docker Toolbox的boot2docker設置NFS掛載而不是VirtualBox共享

4,Linux ACL問題

若是您在docker主機上使用文件ACL,則docker1組須要對捲進行徹底訪問才能使GitLab正常工做。

$ getfacl /srv/gitlab
# file: /srv/gitlab
# owner: XXXX
# group: XXXX
user::rwx
group::rwx
group:docker:rwx
mask::rwx
default:user::rwx
default:group::rwx
default:group:docker:rwx
default:mask::rwx
default:other::r-x

若是這些不正確,請將它們設置爲:

$ sudo setfacl -mR default:group:docker:rwx /srv/gitlab
相關文章
相關標籤/搜索