天天看點

docker上運作mysql服務

背景:

  現如今不管什麼服務和應用基本都可以在docker裡跑一跑了,但是在我個人的印象中,像資料庫這種比較重要大型且資料容易受傷的應用是不适合在docker裡跑的。但是也有很多人嘗試在docker中跑mysql等資料庫,是以也試着嘗試一下。(好吧,重點是上司喜歡~~)

擷取鏡像:

 mysql的鏡像可以自己用dockerfile制作一個,或者直接到官方的docker鏡像庫中下載下傳,本文用的是官方鏡像。

1

2

3

4

<code># docker pull mysql</code>

<code># docker images</code>

<code>REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE </code>

<code>docker.io</code><code>/mysql</code>                                     <code>latest              d9124e6c552f        12 days ago         383.4 MB</code>

運作容器:

 1:正常運作。

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>啟動容器:</code>

<code># docker run --name cmh-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d docker.io/mysql</code>

<code>進入容器:</code>

<code># docker-enter cmh-mysql</code>

<code>進入mysql:</code>

<code>root@3a2b8ab0d971:~</code><code># mysql -u root -pmy-secret-pw</code>

<code>mysql: [Warning] Using a password on the </code><code>command</code> <code>line interface can be insecure.</code>

<code>Welcome to the MySQL monitor.  Commands end with ; or \g.</code>

<code>Your MySQL connection </code><code>id</code> <code>is 2</code>

<code>Server version: 5.7.16 MySQL Community Server (GPL)</code>

<code>Copyright (c) 2000, 2016, Oracle and</code><code>/or</code> <code>its affiliates. All rights reserved.</code>

<code>Oracle is a registered trademark of Oracle Corporation and</code><code>/or</code> <code>its</code>

<code>affiliates. Other names may be trademarks of their respective</code>

<code>owners.</code>

<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the current input statement.</code>

<code>mysql&gt;</code>

 以上就建立了一個mysql的docker容器,可以看到版本為5.7.16。但是這樣建立的容器有兩個問題,一是容器删除後,資料就丢失了,二是要通路資料庫,必須進入到容器裡面才可以。

 2:持久化資料,映射開放mysql端口

19

20

21

22

23

24

25

26

27

28

29

30

31

<code>建立主控端資料存放目錄:</code>

<code># mkdir -p /opt/data/mysql</code>

<code># docker run --name cmh-mysql -v /opt/data/mysql/:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysql</code>

<code>c38f50a540ff4d5ecf1a5ec49fb721335a8e1b79dec58229cf5e00553f988e44</code>

<code>檢視容器:</code>

<code># docker ps </code>

<code>CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS        NAMES</code>

<code>c38f50a540ff        docker.io</code><code>/mysql</code>          <code>"docker-entrypoint.sh"</code>   <code>9 seconds ago       Up 8 seconds        0.0.0.0:3306-&gt;3306</code><code>/tcp</code>         <code>cmh-mysql                                  </code>

<code>檢視端口:</code>

<code># netstat -ntpl</code>

<code>Active Internet connections (only servers)</code>

<code>Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID</code><code>/Program</code> <code>name    </code>

<code>tcp6       0      0 :::3306                 :::*                    LISTEN      28657</code><code>/docker-proxy</code>  

<code>檢視主控端上的mysql資料:</code>

<code># cd /opt/data/mysql</code>

<code># ll</code>

<code>total 188452</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys       56 Dec  6 16:01 auto.cnf</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys     1325 Dec  6 16:01 ib_buffer_pool</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys 79691776 Dec  6 17:16 ibdata1</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys 50331648 Dec  6 17:16 ib_logfile0</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys 50331648 Dec  6 16:01 ib_logfile1</code>

<code>-rw-r-----. 1 systemd-bus-proxy ssh_keys 12582912 Dec  6 17:16 ibtmp1</code>

<code>drwxr-x---. 2 systemd-bus-proxy ssh_keys     4096 Dec  6 16:01 mysql</code>

<code>drwxr-x---. 2 systemd-bus-proxy ssh_keys     8192 Dec  6 16:01 performance_schema</code>

<code>drwxr-x---. 2 systemd-bus-proxy ssh_keys     8192 Dec  6 16:01 sys</code>

 -p 3306:3306把容器的mysql端口3306映射到主控端的3306端口,這樣想通路mysql就可以直接通路主控端的3306端口。

 -v /opt/data/mysql:/var/lib/mysql,即把主控端/opt/data/mysql/目錄映射到容器的/var/lib/mysql目錄。

注意事項:

 1:在使用-v選項映射目錄時,主控端需關閉SElinux:

<code># setenforce 0</code>

 或者給資料目錄添加相關selinux權限:

<code># chcon -Rt svirt_sandbox_file_t /my/own/datadir</code>

 2:-v 選項原本是把主控端的目錄映射進容器,但是在本文中,是反過來的。即是把容器中的目錄映射出主控端,這是因為官方鏡像在制作的時候使用了VOLUME /var/lib/mysql選項。這使得容器中/var/lib/mysql成為一個單獨的卷組,在使用挂載選項-v時,就可以把該目錄映射出主控端。

  可以參考官方mysql鏡像的dockerfile:

  https://github.com/docker-library/mysql/blob/4dd33136c4739667a223d39b6f829beb27b235cf/5.7/Dockerfile

本文轉自 icenycmh 51CTO部落格,原文連結:http://blog.51cto.com/icenycmh/1880084,如需轉載請自行聯系原作者