1. 程式人生 > >Docker容器學習梳理--應用程式容器環境部署

Docker容器學習梳理--應用程式容器環境部署

轉:https://www.cnblogs.com/kevingrace/p/6425424.html

關於國內Docker映象,可以參考:Docker容器學習梳理--基礎知識(2) 的Docker映象使用。

如果我們需要在Docker環境下部署tomcat、redis、mysql、nginx、php等應用服務環境,有下面三種方法:

1

2

3

4

5

6

7

8

9

10

11

1)根據系統映象建立Docker容器,這時容器就相當於是一個虛擬機器,進入容器內部署應用環境。

   然後將這種應用容器提交為新的映象,最後基於這種新的應用映象建立容器,建立時做好埠對映,就可以在外部訪問這些應用了。

2)直接通過docker pull拉取別人提交好的tomcat、nginx等應用程式映象,然後基於這些映象去建立容器。

3)通過dockerfile製作自己的應用程式映象。

 

根據系統映象部署應用容器,簡單做法如下:

1)啟動centos系統映象的容器my_container

2)在my_container容器裡部署例如nginx、php、mysql、php的服務

3)將部署完對應服務的容器my_container提交為新的映象

4)然後根據新映象去建立容器

5)這個新映象可以打包,匯入到別的Docker伺服器上使用

啟動容器時,記得要做好埠對映和目錄對映。埠對映是為了實現在外部能成功訪問到容器裡的應用服務。目錄對映是為了實現宿主機和容器的資料共享,這樣要對容器做修改時,直接在宿主機的對映目錄下做修改就行。修改資料的操作最好不要在容器內進行;原則上來說一個應用啟動一個容器,最好別在一個容器內啟動多個應用。

下面列舉幾個通過應用服務映象部署環境的例子:
Docker宿主機內網ip:192.168.1.23
Docker宿主機外網ip:103.110.186.23
Docker部分命令解釋:

1

2

3

4

5

6

7

-i:表示以“互動模式”執行容器

-t:表示容器啟動後會進入其命令列。加入這兩個引數後,容器建立就能登入進去。即分配一個偽終端。

--name :表示建立的容器名為my-nginx

-v:表示目錄對映關係(前者是宿主機目錄,後者是對映到宿主機上的目錄),可以使用多個-v做多個目錄或檔案對映。

    

注意:最好做目錄對映,在宿主機上做修改,然後共享到容器上。

-d:在run後面加上-d引數,則會建立一個守護式容器在後臺執行(這樣建立容器後不會自動登入容器,如果只加-i -t兩個引數,建立後就會自動進去容器)。docker attch登入容器時如果卡著,按ctrl+c。

-p:表示埠對映,前者是宿主機埠,後者是容器內的對映埠。可以使用多個-p做多個埠對映

如果建立容器時報如下錯:

1

2

3

4

5

6

7

8

9

10

11

12

13

docker: Error response from daemon: failed to create endpoint mosredis on network bridge: iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.6  -j ACCEPT: iptables: No chain/target/match by that name.

 (exit status 1).

 

解決辦法:

一般來說,重啟docker服務,即可解決這個問題。

[[email protected] ~]# systemctl restart docker

[[email protected] ~]#

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

如果重啟docker服務解決不了,那麼如下操作:

[[email protected] ~]# pkill docker

[[email protected] ~]# iptables -t nat -F

[[email protected] ~]# ifconfig docker0 down

[[email protected] ~]# brctl delbr docker0

一、redis容器環境部署

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

拉取redis映象(這裡拉取的是官方映象。也可以自己製作redis映象)

[[email protected] ~]# docker pull redis

[[email protected] ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB

  

用下面的命令啟動Redis容器,記得要帶上“-d”引數.在run後面加上-d引數,則會建立一個守護式容器在後臺執行。

[[email protected] ~]# docker run --name myredis -d docker.io/redis

7a273a550005b8494be9d48970a6cc4efbaddd8a152261310a07237d43c9eb16

 

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

7a273a550005        docker.io/redis     "docker-entrypoint.sh"   3 seconds ago       Up 2 seconds        6379/tcp            myredis

  

連線容器的redis

1)第一種方式:找出容器的ip

[[email protected] ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 7a273a550005

172.17.0.2

  

然後連線容器的redis

[[email protected] ~]# redis-cli -h 172.17.0.2 -p 6379

redis 172.17.0.2:6379> ping      //驗證下redis服務是否已經連線上

PONG

redis 172.17.0.2:6379>

 

2)第二種方式:

[[email protected] ~]# docker run --name myredis -d docker.io/redis

5e260566925e9d6a31b47a47124feb10f3dcfce131c6aa67647881da7874502b

     

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

5e260566925e        docker.io/redis     "docker-entrypoint.sh"   13 minutes ago      Up 13 minutes       6379/tcp            myredis

     

下面的命令表示新建一個容器(命名為myredis2),將redis-cli執行在裡面。然後使用--link將這個容器和之前的redis容器(myredis)連線起來,並將其別名命名為redisdb。

Docker會在redis容器中的/etc/hosts路徑下為"redisdb"建立一個入口,並指向redis容器的IP地址.

這樣在這兩個容器裡就可以使用“redisdb”來作為提供redis容器的機器名,也就可以利用這個別名來連線容器redis。

[[email protected] ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash

[email protected]:/data# redis-cli -h redisdb -p 6379

redisdb:6379> ping

PONG

redisdb:6379>

     

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

當然,這樣也可以如上面先查容器ip進行連線

[[email protected] ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' 5e260566925e

172.17.0.2

[[email protected] ~]# redis-cli -h 172.17.0.2 -p 6379

redis 172.17.0.2:6379>

 

3)第三種方式:通過埠對映,外部連線redis容器應用的方法

建立Redis容器例項,這裡使用了Docker的埠對映機制,從而就可以使用Host伺服器的IP訪問這些redis例項.

如下建立三個redis容器例項

[[email protected] ~]# docker run -d --name node1 -p 7001:6379 docker.io/redis

e4b8ca12d9e76441efe2074ab1109757a33a45aff71d1a553140d48d88133372

[[email protected] ~]# docker run -d --name node2 -p 7002:6379 docker.io/redis

a8ee6f48f431651a0342fba289604046cd5b142f53a7eb43f655dde397a06a6f

[[email protected] ~]# docker run -d --name node3 -p 7003:6379 docker.io/redis

2b61bf6765a8c254df9dd41d3ece6b12f4dd768976e6e22f327516063fc2e634

[[email protected] ~]#

  

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES

2b61bf6765a8        docker.io/redis     "docker-entrypoint.sh"   48 seconds ago       Up 47 seconds       0.0.0.0:7003->6379/tcp   node3

a8ee6f48f431        docker.io/redis     "docker-entrypoint.sh"   55 seconds ago       Up 55 seconds       0.0.0.0:7002->6379/tcp   node2

e4b8ca12d9e7        docker.io/redis     "docker-entrypoint.sh"   About a minute ago   Up About a minute   0.0.0.0:7001->6379/tcp   node1

  

在容器之間建立連線

可以建立應用程式容器,使用--link引數來建立一個連線redis容器,使用別名,將會在redis容器和redis例項容器中建立一個安全的通訊隧道

  

------------node1操作------------

[[email protected] ~]# docker run --link node1:db -i -t docker.io/redis /bin/bash

[email protected]:/data#

  

現在可以測試連線,首先要先檢視下web應用程式容器的環境變數,可以用我們的ip和埠來連線redis容器

[email protected]:/data# env | grep DB_

DB_PORT_6379_TCP_PORT=6379

DB_NAME=/nauseous_heisenberg/db

DB_PORT=tcp://172.17.0.2:6379

DB_PORT_6379_TCP=tcp://172.17.0.2:6379

DB_ENV_GOSU_VERSION=1.7

DB_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz

DB_ENV_REDIS_VERSION=3.2.8

DB_PORT_6379_TCP_ADDR=172.17.0.2

DB_PORT_6379_TCP_PROTO=tcp

DB_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f

  

可以看到上面命令結果中有一個DB為字首的環境變數列表,DB來自指定別名連線對應的應用容器,這裡就可以使用DB_PORT_6379_TCP_ADDR變數連線到Redis容器。

[email protected]:/data# redis-cli -h $DB_PORT_6379_TCP_ADDR

172.17.0.2:6379> ping

PONG

172.17.0.2:6379> set node1 redis-node1

OK

172.17.0.2:6379> get node1

"redis-node1"

172.17.0.2:6379>

  

------------node2操作------------

[[email protected] ~]# docker run --link node2:db2 -i -t docker.io/redis /bin/bash

[email protected]:/data# env | grep DB2_

DB2_PORT_6379_TCP_PROTO=tcp

DB2_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz

DB2_PORT_6379_TCP_ADDR=172.17.0.3

DB2_ENV_GOSU_VERSION=1.7

DB2_PORT=tcp://172.17.0.3:6379

DB2_PORT_6379_TCP_PORT=6379

DB2_ENV_REDIS_VERSION=3.2.8

DB2_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f

DB2_PORT_6379_TCP=tcp://172.17.0.3:6379

DB2_NAME=/furious_kare/db2

  

[email protected]:/data# redis-cli -h $DB2_PORT_6379_TCP_ADDR

172.17.0.3:6379> ping

PONG

172.17.0.3:6379> set node2 redis-node2

OK

172.17.0.3:6379> get node2

"redis-node2"

172.17.0.3:6379>

  

------------node3操作------------

[[email protected] ~]# docker run --link node3:db3 -i -t docker.io/redis /bin/bash

[email protected]:/data# env|grep DB3_

DB3_PORT_6379_TCP_ADDR=172.17.0.4

DB3_PORT_6379_TCP_PORT=6379

DB3_PORT_6379_TCP_PROTO=tcp

DB3_ENV_REDIS_DOWNLOAD_SHA1=6780d1abb66f33a97aad0edbe020403d0a15b67f

DB3_NAME=/amazing_kalam/db3

DB3_PORT=tcp://172.17.0.4:6379

DB3_ENV_REDIS_VERSION=3.2.8

DB3_ENV_GOSU_VERSION=1.7

DB3_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.2.8.tar.gz

DB3_PORT_6379_TCP=tcp://172.17.0.4:6379

  

[email protected]:/data# redis-cli -h $DB3_PORT_6379_TCP_ADDR

172.17.0.4:6379> ping

PONG

172.17.0.4:6379> set node3 redis-node3

OK

172.17.0.4:6379> get node3

"redis-node3"

172.17.0.4:6379>

  

這樣就可以在docker宿主機或其他伺服器上通過宿主機的ip地址以及對映的埠進行連線

[[email protected] ~]# redis-cli -h 192.168.1.23 -p 7001

redis 192.168.1.23:7001> get node1

"redis-node1"

redis 192.168.1.23:7001>

  

[[email protected] ~]# redis-cli -h 192.168.1.23 -p 7002

redis 192.168.1.23:7002> get node2

"redis-node2"

redis 192.168.1.23:7002>

  

[[email protected] ~]# redis-cli -h 192.168.1.23 -p 7003

redis 192.168.1.23:7003> get node3

"redis-node3"

redis 192.168.1.23:7003>

注意一個細節:
建立應用容器的時候,一般會做埠對映,這樣是為了讓外部能夠訪問這些容器裡的應用。可以通過-P或-p引數來指定埠對映

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

1)當使用-p標記時,可以指定埠對映,即容器埠對映到宿主機的對應埠。可以用多個-p指定多個埠對映關係。如下:

[[email protected] ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB

 

[[email protected] ~]# docker run --name myredis -p 63799:6379 -d docker.io/redis

f5d5ff51ace01c5f26fcd65a6ca4853f8556a333c812576123ed71fd3d405737

 

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES

f5d5ff51ace0        docker.io/redis     "docker-entrypoint.sh"   6 seconds ago       Up 5 seconds        0.0.0.0:63799->6379/tcp   myredis

 

[[email protected] ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash

[email protected]:/data# redis-cli -h redisdb -p 6379

redisdb:6379> ping

PONG

redisdb:6379> set test linux

OK

redisdb:6379>

 

在別的機器上通過訪問本機的63799埠連線這個容器的redis

[[email protected] ~]# redis-cli -h 192.168.1.23 -p 63799

192.168.1.23:63799> get test

"linux"

192.168.1.23:63799>

 

 

2)當使用-P標記時,Docker 會隨機對映一個 49000~49900 的埠到內部容器開放的網路埠。如下:

[[email protected] ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/redis     latest              e4a35914679d        2 weeks ago         182.9 MB

 

[[email protected] ~]# docker run --name myredis -P -d docker.io/redis

805d0e21e531885aad61d3e82395210b50621f1991ec4b7f9a0e25c815cc0272

 

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES

805d0e21e531        docker.io/redis     "docker-entrypoint.sh"   4 seconds ago       Up 3 seconds        0.0.0.0:32768->6379/tcp   myredis

 

從上面的結果中可以看出,本地主機的32768埠被對映到了redis容器的6379埠上,也就是說訪問本機的32768埠即可訪問容器內redis埠。

 

測試看下,登陸redis容器,隨意寫個資料

[[email protected] ~]# docker run --rm -it --name myredis2 --link myredis:redisdb docker.io/redis /bin/bash

[email protected]:/data# redis-cli -h redisdb -p 6379

redisdb:6379> set wangshibo huanqiu

OK

redisdb:6379>

 

在別的機器上通過上面對映的埠32768連線這個容器的redis

[[email protected] ~]# redis-cli -h 192.168.1.23 -p 32768

192.168.1.23:32768> get wangshibo

"huanqiu"

二、nginx容器環境部署(下面是自己製作的應用映象)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

[[email protected] ~]# docker images

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

centos                       latest              67591570dd29        3 months ago        191.8 MB

 

為了防止centos7映象容器裡出現:Failed to get D-Bus connection: Operation not permitted 這個bug錯誤,需要在啟動容器的時候新增--privileged引數

並且後面登入容器執行的命令是/sbin/init,如下:

[[email protected] ~]# docker run --privileged -t -i centos /sbin/init

 

上面命令執行後,會一直卡著。這個不要緊,再開啟一個終端視窗,檢視並登入容器:

[[email protected] ~]# docker ps

CONTAINER ID    IMAGE       COMMAND        CREATED          STATUS         PORTS  NAMES

eaf66f1e43ab    centos      "/sbin/init"   16 seconds ago   Up 15 seconds         hungry_khorana

 

[[email protected] ~]# docker exec -it eaf66f1e43ab /bin/bash

[[email protected] /]#

 

接著在容器裡安裝nginx

[[email protected] /]# yum install -y wget lsof vim

 

新增CentOS 7 Nginx yum資源庫,然後安裝nginx

[[email protected] /]# rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

[[email protected] /]# yum install -y nginx

 

[[email protected] conf.d]# pwd

/etc/nginx/conf.d

[[email protected] conf.d]# cat test.conf

server {

listen 8080;

server_name localhost;

location / {

root /var/www/html;

index index.html;

}

}

 

[[email protected] conf.d]# mkdir -p /var/www/html

[[email protected] conf.d]# cat /var/www/html/test.html

this is nginx page of docker!!

 

[[email protected] conf.d]# systemctl start nginx.service

 

將這個容器提交為新的映象

[[email protected] ~]# docker stop eaf66f1e43ab

[[email protected] ~]# docker commit eaf66f1e43ab my-nginx

[[email protected] ~]# docker images

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE

my-nginx                     latest              8dacda904e00        45 minutes ago      314.4 MB

 

將上面提交的映象打包

[[email protected] ~]# docker save my-nginx > /root/my-nginx.tar.gz

 

然後將這個映象包上傳到別的機器上,比如上傳到192.168.1.23機器上的/root下。

在192.168.1.23機器上匯入新映象

[[email protected] ~]# docker load < /root/my-nginx.tar.gz

[[email protected] ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

my-nginx            latest              8dacda904e00        50 minutes ago      314.4 MB

 

啟動nginx容器

[[email protected] ~]# docker run -t -i --privileged --name nginx -v /var/www/html:/var/www/html -p 8899:8080 my-nginx /sbin/init

 

上面命令執行後會卡著,在另一個埠視窗:

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES

3b5cbea50052        my-nginx            "/sbin/init"        36 seconds ago      Up 35 seconds       0.0.0.0:8899->8080/tcp   nginx

[[email protected] ~]# docker exec -t -i 3b5cbea50052 /bin/bash

[[email protected] /]#

 

[[email protected] /]# systemctl start nginx.service

[[email protected] /]# ps -ef|grep nginx

root       117     1  0 16:47 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

nginx      118   117  0 16:47 ?        00:00:00 nginx: worker process

root       120    88  0 16:47 ?        00:00:00 grep --color=auto nginx

[[email protected] /]# cat /etc/nginx/conf.d/test.conf

server {

listen 8080;

server_name localhost;

location / {

root /var/www/html;

index index.html;

}

}

 

[[email protected] /]# cat /etc/nginx/conf.d/test.conf

server {

listen 8080;

server_name localhost;

location / {

root /var/www/html;

index index.html;

}

}

 

[[email protected] ~]# cat /var/www/html/index.html

this is page of Docker-nginx-test!!!

 

Docker宿主機的iptables防火牆設定好對映埠8899

測試訪問

----------------------------------------------------------------------------
根據nginx應用映象直接建立:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

[[email protected] ~]# docker pull nginx

[[email protected] ~]# docker images

docker.io/nginx                latest              5e69fe4b3c31        4 days ago          182.5 MB

 

[[email protected] ~]# docker run -ti -d --name my-nginx -p 9988:80 docker.io/nginx /bin/bash

55ae1f2b1eca6638e11865171f322a55cfa277a0aec06526428a1887229b022e

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                           NAMES

55ae1f2b1eca        docker.io/nginx             "/bin/bash"         3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:9988->80/tcp   my-nginx

 

[[email protected] ~]# docker exec -ti my-nginx /bin/bash

[email protected]:/# find / -name nginx

/etc/default/nginx

/etc/init.d/nginx

/etc/logrotate.d/nginx

/etc/nginx

/usr/lib/x86_64-linux-gnu/perl5/5.20/auto/nginx

/usr/lib/nginx

/usr/sbin/nginx

/usr/share/doc/nginx

/usr/share/lintian/overrides/nginx

/usr/share/nginx

/var/cache/nginx

/var/log/nginx

 

[email protected]:/# mkdir -p /var/web/www

[email protected]:/# exit

exit

 

[[email protected] ~]# docker cp my-nginx:/etc/nginx /var/

[[email protected] ~]# mkdir -p /var/web/www

[[email protected] ~]# cd /var/web/www/

[[email protected] www]# echo "12313123" > index.html

 

[[email protected] ~]# docker stop my-nginx

my-nginx

[[email protected] ~]# docker rm my-nginx

my-nginx

[[email protected] ~]# docker run -ti -d --name my-nginx -v /var/nginx:/etc/nginx -v /var/web/www:/var/web/www -p 8899:80 docker.io/nginx /bin/bash

af8a4594d643197d204200cd1e3b6a3d000cae71ef92826c0e40edfa87026a2a

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS                           NAMES

af8a4594d643        docker.io/nginx             "/bin/bash"         52 seconds ago      Up 50 seconds       443/tcp, 0.0.0.0:8899->80/tcp   my-nginx

 

[[email protected] ~]# vim /etc/sysconfig/iptables

.......

-A INPUT -p tcp -m state --state NEW -m tcp --dport 8899 -j ACCEPT

 

[[email protected] ~]# systemctl restart iptables.service

 

[[email protected] ~]# docker exec -ti my-nginx /etc/init.d/nginx start

 

然後就可以通過訪問http://宿主機ip:8899,進而訪問到nginx容器應用了。

 

接著測試下

[[email protected] ~]# mv /var/nginx/conf.d/default.conf /var/nginx/conf.d/default.conf.bak

[[email protected] ~]# cat /var/nginx/conf.d/test.conf

server {

listen 80;

server_name localhost;

location / {

root /var/web/www;

index index.html;

}

}

 

[[email protected] ~]# echo "12312313" > /var/www/html/test.html

 

接著重啟容器的nginx應用

[[email protected] ~]# docker exec -t -i my-nginx /etc/init.d/nginx restart

 

測試訪問(192.168.1.23是宿主機ip)

[[email protected] ~]# curl http://192.168.1.23:8899/

12313123

可以使用Nginx+Docker實現負載均衡

1

2

3

4

5

6

1)在本機部署兩個nginx的docker容器,埠對應關係分別是8088:80、8089:80

2)在本機在安裝nginx,然後在nginx配置檔案中使用upstream將訪問請求負載到本機的8088和8089埠上,

   這樣也就是將訪問請求負載到兩個容器上了

 

此方案的原理是將宿主機的埠和docker容器的埠做一個對映(即訪問宿主機的某埠會對映到docker容器對應的埠),

然後在宿主機通過配置Nginx,即可達到訪問宿主機的某埠,按規則分配到指定的服務地址,即完成了負載均衡。

三、tomcat容器環境部署

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

[[email protected] ~]# docker images

REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE

docker.io/centos     latest              67591570dd29        3 months ago         191.8 MB

 

[[email protected] ~]# docker run -it --name=container1 docker.io/centos

[[email protected] /]# java -version      //容器裡安裝java

  

上傳宿主機的tomcat到容器裡

[[email protected] ~]# cd /usr/local/src/

[[email protected] src]# ls

apache-tomcat-7.0.57.tar.gz

[[email protected] src]# docker cp apache-tomcat-7.0.57.tar.gz 9df6dc740f01:/usr/local/src/

  

登陸容器,安裝tomcat

[[email protected] /]# cd /usr/local/src/

[[email protected] src]# ls

apache-tomcat-7.0.57.tar.gz

[[email protected] src]# tar -zvxf apache-tomcat-7.0.57.tar.gz

[[email protected] src]# mv apache-tomcat-7.0.57 /usr/local/tomcat7

  

將此容器提交為新的映象

[[email protected] ~]# docker commit container1 tomcat7

sha256:2ec9e2eb978a4af266608fdfd70320bff0886b245a9a2d249cdefdfe70760acb

[[email protected] ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

tomcat7             latest              2ec9e2eb978a        3 minutes ago       562.3 MB

[[email protected] ~]# docker stop container1

container1

[[email protected] ~]# docker rm container1

container1

  

利用新提交的映象啟動tomcat容器

[[email protected] ~]# docker run -t -i -d --name=tomcat -p 8888:8080 tomcat7 /bin/bash

25f20fa6d54a1b2e2454a4d0a3966854e2fe4d81c54c366a1b07da47695f5418

[[email protected] ~]# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS  &