2022年12月28日 星期三

Docker Dockerfile使用

 Dockerfile --製作image 鏡像腳本文件

1.編寫Dockerfile文件

2.docker build 構建鏡像

3.docker run 依鏡像運行容器實例

Dockerfile內容知識

1.Dockerfile每條保留字指令必須要大寫字母且後面要跟隨至少一個參數

2.指令按照從上到下,順序執行

3.#表註解

4.每條指令均會建置一個新的鏡像層並對鏡像進行提交

5.上層映像如有異動,以下所有映像層均會重新建置,所以將常異動的映像層放在底下

Docker執行Dockerfile流程

1.docker從基礎鏡像運行一個容器

2.執行一條指令並對容器做出修改

3.執行類似docker commit的操作提交一個新的鏡像層

4.docker在基於剛提交的鏡像運行一個新容器

5.執行dockerfile中的下一條指令直到所有指令都執行完成

---------------------------------------------------------------------------------------------------------------------

例如:在centos中加入vim,ifconfig,jdk8,先下載jdk-8u171-linux-x64.tar.gz與Dockerfile同一目錄

#基礎鏡像來源

FROM centos

MAINTAINER sct<xxx@gmail.com>

ENV MYPATH /usr/local

WORKDIR $MYPATH

#安裝vim

RUN yum -y install vim

#安裝ifconfig

RUN yum -y install net-tools

#安裝java8及lib

RUN yum -y install glibc.i686

RUN mkdir /usr/local/java

#ADD 是相對路徑jar,把jdk-8u171-linux-x64.tar.gz加入容器中,安裝包必須與Dockerfile文件在同一位置

#ADD將宿主機目錄下的文件拷貝進鏡像且會自動處理URL及解壓tar壓縮包

ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/

#配置java環境變量

ENV JAVA_HOME /usr/local/jdk1.8.0_171

ENV JRE_HOME $JAVA_HOME/jre

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

EXPOSE 80

CMD echo $MYPATH

CMD echo "success........ok"

CMD /bin/bash

----------------------------------------------------------------------------------------------------

建置Dockerfile

docker build -t 新鏡像名字:TAG .     -->後面要有個 . ,表示目前目錄下構建docker image

docker build -t centosjava8:1.5 .

docker build --tag centosjava8:1.5 .

運行測試

docker run -it 新鏡像名字:TAG

---------------------------------------------------------------------------------------------------

多階段建置映像檔方式

建置Dockerfile其順序為由上而下產生,每一行均產生一個image,如果有一行變動,其以下均會重新產生新的image,浪費時間,所以會將常異動的指令放在底下,但要注意指令的先後順序。

重新build後,檔案會變大時,就需要使用--多階段建置映像檔方式

例如:

FROM alpine:3.16.2 AS test1

RUN echo 'Builder' > /example.txt


FROM alpine:3.16.2 AS tester

COPY --from=test1 /example.txt /example.txt

RUN echo 'Tester' >> /example.txt


FROM alpine:3.16.2

COPY --from=tester /example.txt /example.txt

CMD [ "cat","/example.txt" ]

...

FROM與FROM之間為一個階段,階段完成後,就會將前一個階段編譯的工具丟棄,大幅減少了映像檔的大小。

其精華在COPY --from,讓我們從另一個映像檔複製檔案到現階段的映像檔。

------------------------------------------------------------------------------------------------

使用.dockerignore

在Dockerfile目錄加入.dockerignore 檔案,其內容如

.dockerignore 

./README.md

./Dockerfile

如果Dockerfile中有COPY . .

將會把README.md及Dockerfile排除


2022年12月27日 星期二

docker mysql 主從複製

 1.主服務器

docker run -p 3307:3306 --name mysql-master \

-v /mydata/mysql-master/log:/var/log/mysql \

-v /mydata/mysql-master/data:/var/lib/mysql \

-v /mydata/mysql-master/conf:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=root \

-d mysql:5.7

2.在/mydata/mysql-master/conf 新建my.cnf

cd /mydata/mysql-master/conf 

sudo vi my.cnf

[mysqld]

##設置server_id,同一網域中需要唯一

server_id=101

##指定不需要同步的數據名稱

binlog-ignore-db=mysql

##開啟二進制日誌功能

log-bin=mall-mysql-bin

##設置二進制日誌使用記憶體大小(事務)

binlog_cache_size=1M

##設置使用的二進制日誌格式(mixed,statement,row)

binlog_format=mixed

##二進制日誌過期清理時間。默認值為0,表示不自動清理

expire_logs_days=7

##跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷

##如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據不一致

slave_skip_errors=1062

3.修改後重啟master

docker restart mysql-master

4.進入mysql-master 容器

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

show databases;

5.mysql-master容器內建數據同步用戶

create user 'slave'@'%' identified by '12345678';

grant replication slave,replication client on *.* to 'slave'@'%';

6.新建從服務器

docker run -p 3308:3306 --name mysql-slave \

-v /mydatamysql-slave/log:/var/log/mysql \

-v /mydata/mysql-slave/data:/var/lib/mysql \

-v /mydata/mysql-slave/conf:/etc/mysql \

-e MYSQL_ROOT_PASSWORD=root \

-d mysql:5.7

7.在/mydata/mysql-slave/conf 新建my.cnf

cd /mydata/mysql-slave/conf 

sudo vi my.cnf

[mysqld]

##設置server_id,同一網域中需要唯一

server_id=102

##指定不需要同步的數據名稱

binlog-ignore-db=mysql

##開啟二進制日誌功能,以備slave作為其他數據實例的master時使用

log-bin=mall-mysql-slave1-bin

##設置二進制日誌使用記憶體大小(事務)

binlog_cache_size=1M

##設置使用的二進制日誌格式(mixed,statement,row)

binlog_format=mixed

##二進制日誌過期清理時間。默認值為0,表示不自動清理

expire_logs_days=7

##跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷

##如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據不一致

slave_skip_errors=1062

##relay_log配置中繼日誌

relay_log=mall-mysql-relay-bin

##log_slave_updates表示slave將複製事件寫入自己的二進制日誌

log_slave_updates=1

##slave設置為只讀(具有super權限的用戶除外)

read_only=1

8.修改後重啟slave

docker restart mysql-slave

9.在主數據庫中查看主從同步狀態

在主服務器的mysql中,show master status;

10.進入mysql-slave 容器

docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

show databases;

11.在從服務器數據庫中配置主從複製-->在mysql中

change master to master_host='宿主機IP',master_user='slave',master_password='12345678',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_count_retry=30;

12.在從服務器數據庫中查看主從同步狀態

show slave status \G;

看slave_io_running:no   slave_sql_running:no -->表示還沒開始同步

13.在從服務器數據庫中開啟主從同步

start slave;

14.查看從服務器數據庫狀態發現已經同步

show slave status \G;

看slave_io_running:yes   slave_sql_running:yes -->表示已經開始同步

15.主從複製測試

在主服務器數據庫

create database db01;

use db01;

create table t1 (id int,name varchar(20));

insert into t1 values(1,'z3');

select * from t1;

在從服務器數據庫

use db01;

select * from t1;

看資料是否有進來





2022年12月26日 星期一

docker 虛懸鏡像

 那些標簽像被稱為懸虛鏡像,在列表中展示<none>:<none>

查詢顯示虛懸鏡像

docker images -f dangling=true

刪除虛懸鏡像

docker rmi $(docker images -q -f dangling=true) 或 docker image prune



2022年12月23日 星期五

Ubuntu 如何啟用,停用 root 帳號與切換為 root 使用者

參考:http://joshchangs.blogspot.com/2017/03/ubuntu-root-root.html

查 root 帳號是否有被啟動

sudo passwd -S root

root L 08/09/2022 0 99999 7 -1  --P 為啟動狀態,L 為停用狀態

要停用 root 帳號 

sudo passwd -l root
或者
sudo passwd -p '!' root


Ubuntu 原本的 root 是預設尚未設定密碼(不是空白密碼), 第一次使用root的話使用sudo passwd root指令, 若之前尚未使用sudo執行其他指令, 此時一樣會提示你輸入你的使用者密碼(sudo確認身份用的).
當此密碼通過後, sudo會執行後面的指令, 也就是用root權限執行 passwd root(修改root密碼), 跟著系統提示輸入兩次root密碼後就將root密碼改成功了!

sct@sct-linux:~$ sudo passwd root
[sudo] password for sct: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully


以後若不想用 sudo 而想直接用 root 權限的話就使用 su - 切換進 root 身份即可

sct@sct-linux:~$ su -
Password: 
root@sct-linux:~#



2022年12月22日 星期四

Docker 建置 mysql

 1.docker run -d -p 3306:3306 --privileged=true    \

    -v /abc/mysql/log:/var/log/mysql    \

    -v /abc/mysql/data:/var/lib/mysql    \

    -v /abc/mysql/conf:/etc/mysql/conf.d    \

    -e MYSQL_ROOT_PASSWORD=12345678    \

    --name=mysql    \

    mysql:5.7

2.新建my.cnf

cd /abc/mysql/conf

vi my.cnf

加入

[client]

default_character_set=utf8

[mysqld]

collation_server=utf8_general_ci

character_set_server=utf8

3.重新啟動mysql容器,再進入查看字符編碼

docker restart mysql

docker exec -it mysql bash

mysql -uroot -p

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';

4.測試,看中文是否為亂碼

show databases;

create database db01;

use db01;

create table t1(id int,name varchar(40));

insert into t1 values(1,'u3');

insert into t1 values(2,'王五');

select * from t1;

--------------------------------------------------------------

安裝mysql 8

docker run --name 容器名稱 -d  mysql --net=網路名稱 -p xxxx:xxxx --privileged=true  \

-e MYSQL_ROOT_PASSWORD=MYSQL的管理員密碼 \

-e MYSQL_DATABASE=資料庫網域名稱 \

-e MYSQL_USER=MYSQL的使用者名稱 \

-e MYSQL_PASSWORD=MYSQL的使用者密碼 \

--character-set-server=字元編碼 \

--collationserver=字符對照表 \

--default-authentication-plugin=驗證方式

--------------------------------------------------------

例如

docker network create netmysql

docker run --name mymysql -d --net=netmysql -p 3306:3306 --privileged=true \

-e MYSQL_ROOT_PASSWORD='12345678' \

-e MYSQL_DATABASE=sctmysql \

-e MYSQL_USER=sct \

-e MYSQL_PASSWORD='sct123456' \

mysql \

--character-set-server=utf8mb4 \

--collation-server=utf8mb4_unicode_ci \

--default-authentication-plugin=mysql_native_password


=============================================

docker run -d -p 3306:3306 --privileged=true    \

-v /abc/mysql/log:/var/log/mysql    \

-v /abc/mysql/data:/var/lib/mysql    \

-v /abc/mysql/conf:/etc/mysql/conf.d    \

-e MYSQL_ROOT_PASSWORD=12345678    \

-e MYSQL_DATABASE=sctmysql \

-e MYSQL_USER=sct \

-e MYSQL_PASSWORD='sct123456' \

--name=mysql \

mysql


vi my.cnf

加入

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

collation-server=utf8mb4_unicode_ci

character-set-server = utf8mb4

character-set-client-handshake = FALSE




2022年12月14日 星期三

Hyper-v設定巢狀虛擬化

設定巢狀虛擬化--關閉虛擬機,以系統管理員開啟PowerShell

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true

停用巢狀虛擬化--關閉虛擬機,以系統管理員開啟PowerShell

Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $false

改變 MAC 位址--關閉虛擬機,以系統管理員開啟PowerShell

Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On


參考:https://learn.microsoft.com/zh-tw/virtualization/hyper-v-on-windows/user-guide/nested-virtualization