1. 程式人生 > >Docker基本管理

Docker基本管理

docker文件復制 數據庫備份 wordpress安裝 容器間數據共享

1. 運行Docker的第一個容器,進行測試

解決:

[root@c720120 ~]# docker run busybox echo hello world
Unable to find image ‘busybox:latest‘ locally
latest: Pulling from library/busybox
07a152489297: Pull complete 
Digest: sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Status: Downloaded newer image for busybox:latest
hello world
(1)查看運行的容器:
[root@c720120 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

可以看出前面沒有任何的容器處於運行的狀態,這是因為容器在執行完echo hello world命令後自動退出了。

(2)查看所有容器(包含已經停止的)

CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
80d8496f3e1d        busybox             "echo hello world"   7 minutes ago       Exited (0) 7 minutes ago                       infallible_wright

上面可以看到我們運行的hello-world.

(3)如果我們運行一個容器且想要進入該容器的終端,執行以下命令:例:

[root@c720120 ~]# docker run -t -i ubuntu:14.04 /bin/bash
Unable to find image ‘ubuntu:14.04‘ locally
14.04: Pulling from library/ubuntu
324d088ce065: Pull complete 
2ab951b6c615: Pull complete 
9b01635313e2: Pull complete 
04510b914a6c: Pull complete 
83ab617df7b4: Pull complete 
Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
Status: Downloaded newer image for ubuntu:14.04
root@8845bfc2b967:/# 

選項解釋:-t代表終端,-i代表進入交互模式

2. 運行Docker的容器在一個分離的模式

解決:使用-d選項,代表是以後端進程的模式運行:

[root@c720120 ~]# docker run -d -p 1234:1234 python:2.7 python -m SimpleHTTPServer 1234
Unable to find image ‘python:2.7‘ locally
2.7: Pulling from library/python
cc1a78bfd46b: Pull complete 
6861473222a6: Pull complete 
7e0b9c3b5ae0: Pull complete 
3ec98735f56f: Pull complete 
9b311b87a021: Pull complete 
7a5e5e5b06b6: Pull complete 
e54e82f81b9b: Pull complete 
bb4f45bde0ff: Pull complete 
18a3b44c196a: Pull complete 
Digest: sha256:b4a2a74875705c13220c0950c8df6401524d616468b014a19c6efb84c50bbb7e
Status: Downloaded newer image for python:2.7
ba3c0258f2afe21d1c62629546d5257fc98b03b14492b95e796184987e6b99f1

[root@c720120 ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
ba3c0258f2af        python:2.7          "python -m SimpleHTT…"   11 seconds ago      Up 10 seconds       0.0.0.0:1234->1234/tcp   amazing_euler

3. 使用Docker File構建一個鏡像

描述 :DockerFile是一個文本文件,該文本文件就是把一堆的步驟組合在一起,完成自動化的管理,如安裝鏡像,創建文件夾,映射端口等一堆操作。

簡單示例:Dockerfile內容如下:
FROM busybox
ENV foo=bar

使用docker build命令去構建一個新的鏡像叫做busybox2:如下

[root@c720120 docker]# docker build -t busybox2 .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM busybox
 ---> 8c811b4aec35
Step 2/2 : ENV foo=bar
 ---> Running in 6bc62bd05faf
Removing intermediate container 6bc62bd05faf
 ---> 428e72e9e893
Successfully built 428e72e9e893
Successfully tagged busybox2:latest

構建完成後,查看我們的鏡像:

4. 使用Supervisor 在一個容器中運行WordPress示例

wordpress包括了MYSQL和HTTPD,PHP組件:使用Supervisor去監控和運行MYSQL和HTTPD
該知識點是使用supervisor在一個容器裏去運行多個進程。
wp-config.php文件配置如下:

<?php
/
 * The base configurations of the WordPress.
 *
 * This file has the following configurations: MySQL settings, Table Prefix,
 * Secret Keys, and ABSPATH. You can find more information by visiting
 * {@link http://codex.wordpress.org/Editing_wp-config.php Editing wp-config.php}
 * Codex page. You can get the MySQL settings from your web host.
 *
 * This file is used by the wp-config.php creation script during the
 * installation. You don‘t have to use the web site, you can just copy this file
 * to "wp-config.php" and fill in the values.
 *
 * @package WordPress
 */

//  MySQL settings - You can get this info from your web host  //
/ The name of the database for WordPress */
define(‘DB_NAME‘, ‘wordpress‘);

/ MySQL database username */
define(‘DB_USER‘, ‘root‘);

/ MySQL database password */
define(‘DB_PASSWORD‘, ‘root‘);

/ MySQL hostname */
define(‘DB_HOST‘, ‘localhost‘);

/ Database Charset to use in creating database tables. */
define(‘DB_CHARSET‘, ‘utf8‘);

/ The Database Collate type. Don‘t change this if in doubt. */
define(‘DB_COLLATE‘, ‘‘);

/#@+
 * Authentication Unique Keys and Salts.
 *
 * Change these to different unique phrases!
 * You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
 * You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
 *
 * @since 2.6.0
 */
define(‘AUTH_KEY‘,         ‘put your unique phrase here‘);
define(‘SECURE_AUTH_KEY‘,  ‘put your unique phrase here‘);
define(‘LOGGED_IN_KEY‘,    ‘put your unique phrase here‘);
define(‘NONCE_KEY‘,        ‘put your unique phrase here‘);
define(‘AUTH_SALT‘,        ‘put your unique phrase here‘);
define(‘SECURE_AUTH_SALT‘, ‘put your unique phrase here‘);
define(‘LOGGED_IN_SALT‘,   ‘put your unique phrase here‘);
define(‘NONCE_SALT‘,       ‘put your unique phrase here‘);

/#@-*/

/
 * WordPress Database Table prefix.
 *
 * You can have multiple installations in one database if you give each a unique
 * prefix. Only numbers, letters, and underscores please!
 */
$table_prefix  = ‘wp_‘;

/
 * For developers: WordPress debugging mode.
 *
 * Change this to true to enable the display of notices during development.
 * It is strongly recommended that plugin and theme developers use WP_DEBUG
 * in their development environments.
 */
define(‘WP_DEBUG‘, false);

/* That‘s all, stop editing! Happy blogging. */

/ Absolute path to the WordPress directory. */
if ( !defined(‘ABSPATH‘) )
    define(‘ABSPATH‘, dirname(FILE) . ‘/‘);

/ Sets up WordPress vars and included files. */
require_once(ABSPATH . ‘wp-settings.php‘);
```**

supervisord.conf文件內容如下:

[supervisord]
nodaemon=true

[program:mysqld]
command=/usr/bin/mysqld_safe
autostart=true
autorestart=true
user=root

[program:httpd]
command=/bin/bash -c "rm -rf /run/httpd/* && /usr/sbin/apachectl -D FOREGROUND"

Dockerfile文件內容如下:
FROM ubuntu:14.04

RUN apt-get update && apt-get -y install \
apache2 \


```php5 php5-mysql supervisor wget

RUN echo ‘mysql-server mysql-server/root_password password root‘ |     debconf-set-selections &&     echo ‘mysql-server mysql-server/root_password_again password root‘ |     debconf-set-selections

RUN apt-get isntall -qqy mysql-server

RUN wget http://wwordpress.org/latest.tar.gz &&     tar xzvf latest.tar.gz &&     cp -R ./wordpress/* /var/www/html &&     rm /var/www/html/index.html
    RUN (/usr/bin/mysqld_safe &); sleep 5; mysqladmin -u root -proot create wwordpress

    COPY wp-config.php /var/www/html/wp-config.php5
    COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

    EXPOSE 80

    CMD ["/usr/bin/supervisord"]

然後運行

docker build -t wordpress .
docker run -d -p 80:80 wordpress

通過使用supervisor去運行多個應用服務在一個容器中雖說可以工作,但最好在多個容器中運行,官方網站也是建議一個容器中只運行一個服務。

4. 使用link的方式把兩個容器連接在一起進行通信,一個容器運行數據庫,另一個容器運行wordpress.

(1)拉取鏡像

$ docker pull wordpress:latest
$ docker pull mysql:latest
$ docker images

(2)運行一個MYSQL的容器,並通過一個環境變量設置MYSQL_ROOT_PASSWORD

[root@c720120 supervisor]# docker run --name mysqlwp -e MYSQL_ROOT_PASSWORD=wordpressdocker -d mysql
3a3ed895c2eaf4f252a2e73df660cb127bf1924db6bcd52f7a74509e108a61ae

(3)運行wordpress的容器,並使用--link選項把它與mysql的容器連接在一起,

[root@c720120 supervisor]# docker run --name wordpress --link mysqlwp:mysql -p 80:80 -d wordpress
5ad18e45b2154c0e04919d6df22567631b0f4ed9ce27fa411b135aff31e26012

當我打開瀏覽器時,無法正常打開wordpress頁面。使用docker logs wordpress,報錯信息如下:

解決方法步驟:

docker exec -it mysqlwp /bin/bashj
mysql -uroot -pwordpressdocker
ALTER USER ‘root‘@‘%‘ IDENTIFIED WITH mysql_native_password BY ‘wordpressdocker‘;
(4)docker start wordpress

註意:一般不建議使用數據庫root的帳戶去連接應用,可能會帶來安全問題。創建用戶名、密碼、數據庫如下:

[root@c720120 ~]# docker run --name mysqlwp -e MYSQL_ROOT_PASSWORD=wordpressdocker > -e MYSQL_DATABASE=wordpress > -e MSYQL_USER=wordpress > -e MYSQL_PASSWORD=wordpresspwd > -d mysql
15e8b91a5a48b336a014802041767dc715e805de82c21999dfd9ea6732e22eef

數據庫創建完成後,在運行wordpress需要指明我們創建的用戶名、密碼、數據庫等信息。

[root@c720120 ~]# docker run --name wordpress --link mysqlwp:mysql -p 80:80 > -e WORDPRESS_DB_NAME=wordpress > -e WORDPRESS_DB_USER=wordpress > -e WORDPRESS_PASSWORD=wordpresspwd > -d wordpress
a81ca93e6a25b2b05cd689a3f3c7e6f13d5d3f3817868c80db51c1edb09e596d

假如想要移除所有的容器可以使用以下命令:

$docker stop $(dokcer ps -q)
$ docker rm -v $(docker ps -aq)

5. 備份在容器中的數據庫文件

需求:由於虛擬機在停止移除後,裏面的數據會丟失,但數據庫又要保證一致性,所以我們需要備份 我們在容器中的數據庫。
備份方法:
(1)從Docker host掛載數據卷到容器中去。

[root@c720120 ~]# docker run --name mysqlwp -e MYSQL_ROOT_PASSWORD=wordpressdocker -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpresspwd -v /home/root/mysql:/var/lib/mysql -d mysql
b2913d5133196c5437fdeba0ff0753b467b9614aa6c51129deca516895846a4f

此時,我們可以查看我們容器中的mysql各文件

[root@c720120 ~]# ls /home/root/mysql/
auto.cnf       binlog.index  client-cert.pem  ibdata1      ibtmp1     performance_schema  server-cert.pem  undo_001
binlog.000001  ca-key.pem    client-key.pem   ib_logfile0  mysql      private_key.pem     server-key.pem   undo_002
binlog.000002  ca.pem        ib_buffer_pool   ib_logfile1  mysql.ibd  public_key.pem      sys              wordpress

(2)使用docker exec命令去調用mysqldump

[root@c720120 ~]# docker exec mysqlwp mysqldump --all-databases --password=wordpressdocker > wordpress.backup
mysqldump: [Warning] Using a password on the command line interface can be insecure.

查看我們的備份文件,如下所示:

·1.11 在容器和Docker host之間共享數據

(1)
[root@c720120 tmp]# ls -l
total 0
-rw-r--r-- 1 root root 0 May 27 10:19 data

(2)運行一個容器,並掛載當前目錄到容器的/cookbook中去,並在容器的cookbook文件夾下創建文件,然後在Docker host中查看是否存在這個文件。

[root@c720120 tmp]# docker run -it -v "$PWD":/cookbook ubuntu:14.04 /bin/bash
root@568bfa25fd31:/# touch /cookbook/foobar
root@568bfa25fd31:/# exit
exit

(3)查看是否有我們剛才創建的文件

[root@c720120 tmp]# ls -l foobar 
-rw-r--r-- 1 root root 0 May 27 10:21 foobar

註意:默認我們掛載的目錄是以讀寫方式,假如我們想以只讀的方式的話,需要明確指定。
使用如下格式:
-v "$PWD":/cookbook:ro

檢查掛載的對應信息:使用如下命令:

$ docker inspect -f {{.Mounts}} 44d71a605b5b
[{ /Users/sebastiengoasguen/Desktop /cookbook true}]

6. 容器和容器之間數據共享

如果我們在掛載卷時沒有指定本地的位置時,根據不同的環境可能默認的位置不一樣,這裏我們來查看我們的環境的默認位置,我們的位置是/var/lib/docker/volumes/a198d9fac794b46bacd0a587f7bf4347fd6c617e287181c223ca257b35c1647b/_data /cookbook

[root@c720120 tmp]# docker run -it -v /cookbook ubuntu:14.04 /bin/bash
root@be58bd9b2cd1:/# 
root@be58bd9b2cd1:/# 
root@be58bd9b2cd1:/# touch /cookbook/foobar
root@be58bd9b2cd1:/# ls cookbook/
foobar
root@be58bd9b2cd1:/# exit
exit
d[root@c720120 tmp]# docker inspect -f {{.Mounts}} be58
[{volume a198d9fac794b46bacd0a587f7bf4347fd6c617e287181c223ca257b35c1647b /var/lib/docker/volumes/a198d9fac794b46bacd0a587f7bf4347fd6c617e287181c223ca257b35c1647b/_data /cookbook local  true }]

和其它容器之間共享數據,使用--volumes-from選項。
案例:
(1)創建一個容器,並掛載目錄
[root@c720120 _data]# docker run -v /data --name data ubuntu:14.04

(2)查看容器/data目錄與docker host之間的對應關系
[root@c720120 _data]# docker inspect -f {{.Mounts}} data
[{volume 605c56152f8892a7ac07120669ee01ef20ac62f00baaf47f56aca6a19b10b91e /var/lib/docker/volumes/605c56152f8892a7ac07120669ee01ef20ac62f00baaf47f56aca6a19b10b91e/_data /data local true }]

(3)創建另外一個容器,在此我們使用--volumes-from選項,並創建一個文件

[root@c720120 _data]# docker run -ti --volumes-from data ubuntu:14.04 /bin/bash
root@5a5d99af6149:/# touch /data/foobar

(4)在docker-host查看是否有該文件,記著查詢的目錄 應該是第一個容器的映射的本地目錄位置。

[root@c720120 _data]# ls /var/lib/docker/volumes/605c56152f8892a7ac07120669ee01ef20ac62f00baaf47f56aca6a19b10b91e/_data
foobar

7. 從容器中復制數據(進和出)

使用copy命令可以把數據從容器中復制到Docker host,或從docker host復制到容器中都可以。
(1)創建一個容器,並創建一個文件

[root@c720120 _data]# docker run -d --name testcopy ubuntu:14.04 sleep 360
[root@c720120 _data]# docker exec -ti testcopy /bin/bash
[root@c720120 _data]# docker exec -ti testcopy /bin/bash
root@90d654f31d93:/# cd /root/
root@90d654f31d93:~# echo ‘I am in the container‘ > file.txt
root@90d654f31d93:~# exit

(2)從docker容器復制文件到docker主機的當前目錄,並查看我們的文件內容,是不是在容器中創建的文件。

[root@c720120 _data]# docker cp testcopy:/root/file.txt .
[root@c720120 _data]# cat file.txt
I am in the container

(3)從主機復制文件到容器中

[root@c720120 _data]# echo ‘I am in the host‘ > host.txt
[root@c720120 _data]# docker cp host.txt testcopy:/root/host.txt

註意:在docker1.8之前,是不支持從docker主機復制文件到容器中的,那麽我們可以使用以下命令代替。

$ echo ‘I am in the host‘ > host.txt
$ docker exec -i textcopy sh -c ‘cat > /root/host.txt‘ < host.txt
$ docker exec -i testcopy sh -c ‘cat /root/host.txt‘

技術討論群:190029784

Docker基本管理