apt-get commands

$ apt-get -h

# 更新來源
$ sudo apt-get update
$ sudo apt-get -y update

# 安裝 / 更新
# 如果已經安裝過了就會更新
$ sudo apt-get install nginx

# -y 是略過手動確定
$ sudo apt-get install git-core -y 

# -qq 是指 No output except for errors
$ sudo apt-get install libxml2-dev -qq

# 重新安裝
$ sudo aptitude reinstall libxml2-dev

# 移除
$ sudo apt-get remove nginx
$ sudo apt-get remove rabbitmq-server
$ sudo apt-get remove --purge mariadb-galera-server-5.5
$ sudo apt-get autoremove
$ sudo apt-get autoclean

# 查詢版本
$ sudo apt-cache show nginx
$ aptitude show nginx
$ aptitude versions rabbitmq
$ aptitude versions libxml2-dev

# 搜尋
$ aptitude search nginx
$ apt-cache search nginx

# list installed packages
$ dpkg --get-selections
$ dpkg --get-selections | grep -v deinstall

# show support status
$ ubuntu-support-status

Issues

sudo: add-apt-repository: command not found

$ sudo apt-get install python-software-properties

Ubuntu sources.list repository 分類

main 即「基本」組件,其中只包含符合 Ubuntu 的許可證要求並可以從 Ubuntu 團隊中獲得支持的軟體,致力於滿足日常使用,位於這個組件中的軟體可以確保得到技術支援和及時的安全更新。此組件內的軟體是必須符合 Ubuntu 版權要求(Ubuntu license requirements)的自由軟體,而 Ubuntu 版權要求大致上與 Debian 自由軟體指導綱要(Debian Free Software Guidelines)相同。

restricted 即「受限」組件,其中包含了非常重要的,但並不具有合適的自由許可證的軟體,例如只能以二進位形式獲得的顯卡驅動程式。由於 Ubuntu 開發者無法獲得相應的原始碼,restricted 組件能夠獲得的支持與 main 組件相比是非常有限的。

universe 即「社群維護」組件,其中包含的軟體種類繁多,均为自由软件,但都不為 Ubuntu 團隊所支援。

multiverse 即「非自由」組件,其中包括了不符合自由軟體要求而且不被 Ubuntu 團隊支援的软件包,通常為商業公司編寫的軟體。

Deal with persistent storage with Docker volumes

Deal with persistent storage with Docker volumes

-v /var/lib/mysql 和 Dockerfile 裡的 VOLUME ["/var/lib/mysql"]
僅僅是 mkdir -p 然後「標示」該目錄要作為 volume
讓你可以在其他 container 使用 --volumes-from 來 mount 這個目錄
除此之外沒有做其他事

-v /host/path/:/var/lib/mysql 是把 host 的目錄 mount 進 container
但是不建議這麼做
因為這樣就不 portable 了

無論是 -v 還是寫在 Dockerfile 裡的 VOLUME
volume 都是在 docker run 的時候才建立的
volume 是跟著 container 而不是 image

volume 會一直存在
直到你用 docker rm -v 刪掉最後一個關聯到它的 container 為止

--

要注意的是
如果你寫

VOLUME ["/etc/mysql", "/var/lib/mysql"]
RUN apt-get update && apt-get install -y \
    mysql-server-5.5

因為在安裝 mysql 之前
就先建立了 /etc/mysql/var/lib/mysql 這兩個空目錄
所以 mysql-server 就不會幫你塞那些 config 檔案和執行 mysql_install_db 了

--

官方的建議是各開一個 mysql container 和 mysql data container
好處是之後你要升級 mysql 時
只要用新版本的 mysql container 去 --volumes-from 那個 mysql data container 即可

ref:
http://www.offermann.us/2013/12/tiny-docker-pieces-loosely-joined.html
http://stackoverflow.com/questions/25401951/mysql-installed-and-persisting-data-in-docker-images

如果你只用一個 mysql container 並 VOLUME ["/var/lib/mysql"] 的話
之後再開一個新版本的 mysql container 去 --volumes-from
會因為有兩個 container 都 EXPOSE 3306
所以那個新版本的 container 開不起來

不過
平常開發的話
其實一個 mysql container 也就可以了
只要 mysql container 有 VOLUME ['/var/lib/mysql/'] 目錄
之後要存取 mysql data 時
只需要 --volumes-from mysql_container 即可