Bagaimana cara mengubah direktori instalasi gambar buruh pelabuhan?
183
Dari apa yang saya tahu, gambar buruh pelabuhan diinstal ke /var/lib/dockersaat mereka ditarik. Apakah ada cara untuk mengubah lokasi ini, seperti volume yang dipasang seperti /mnt?
Dengan versi yang lebih lama, Anda dapat mengubah direktori basis penyimpanan Docker (tempat penampung dan gambar) menggunakan -gopsi saat memulai daemon Docker. (periksa docker --help). Anda dapat memiliki pengaturan ini diterapkan secara otomatis ketika Docker mulai dengan menambahkannya ke / etc / default / docker
Saya pikir solusi terbaik adalah menambahkan -gopsi ini ke / etc / defaults / docker daripada memodifikasi file Upstart, lihat jawaban saya.
mbarthelemy
9
Ya, ubah baris ini keDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Tidak berfungsi di Fedora. Lihat jawaban saya jika distro Anda adalah Fedora
Vitor
3
Anda mungkin perlu mengimplementasikan solusi ini ke bug di beberapa versi Debian atau Ubuntu jika buruh pelabuhan mengabaikan /etc/default/dockerfile Anda .
Mengikuti saran dari komentar saya menggunakan dokumentasi Docker systemd untuk meningkatkan jawaban ini. Prosedur di bawah ini tidak memerlukan reboot dan jauh lebih bersih.
Pertama-tama buat direktori dan file untuk konfigurasi khusus:
Saya baru-baru ini mencoba prosedur di atas dengan 17.09-ce pada Fedora 25 dan sepertinya tidak berhasil. Alih-alih modifikasi sederhana dalam /etc/docker/daemon.jsonmelakukan trik:
{
"graph": "/mnt",
"storage-driver": "overlay"
}
Meskipun demikian Anda harus memuat ulang konfigurasi dan memulai kembali Docker:
Ini hanya metode yang membantu saya di Ubuntu 16.04!
Vadim
1
Tautan ini docs.docker.com/engine/admin/systemd menjelaskan cara mengkonfigurasi Docker dengan systemd, yang berfungsi untuk distribusi linux yang lebih baru seperti Ubuntu 16.04.
Joseph Hui
6
The docker infoPernyataan mungkin usang. Di Ubuntu 16.04, pemeriksaan untuk konfigurasi ulang adalah sudo docker info | grep "Docker Root Dir". Kalau tidak, jawaban yang baik, harus yang diterima;)
Guillaume Perrot
5
Dalam versi baru Linux (4.10) dan Docker (docker-ce 17.06) baris harus diubah sebagai berikut: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Jika Anda melihat Docker Root Dir: /"/mnt"ketika Anda menjalankan docker info|grep "Docker Root Dir", Anda harus mengganti --data-root="/mnt"ke --data-root=/mntdalam filedocker-storage.conf
Penjelasan langkah-demi-langkah yang lebih rinci (termasuk memindahkan data) menggunakan Docker Storage dengan data-root dapat ditemukan di: Posting blog
Saya pikir sudah waktunya untuk memberikan jawaban ini bendera "diterima", karena ini berfungsi dalam versi saat ini.
The Bndr
Saya berkomentar di sini untuk memberi tahu orang-orang versi mana yang bisa menggunakan ini, setelah github.com/docker/docker.github.io/pull/5978 rilis, Ini mengubah situs web officail.
zhongjiajie
Ini juga bekerja untuk saya, Terima kasih :)
Aashay Amballi
39
Karena saya belum menemukan instruksi yang benar untuk melakukan ini di Fedora (EDIT: orang menunjuk komentar bahwa ini juga harus bekerja pada CentOS dan Suse) (/ etc / default / docker tidak digunakan di sana), saya menambahkan jawab di sini:
Anda harus mengedit / etc / sysconfig / docker , dan menambahkan opsi -g di variabel OPTIONS. Jika ada lebih dari satu opsi, pastikan Anda menyertakannya di "". Dalam kasus saya, file itu berisi:
OPTIONS=--selinux-enabled
jadi itu akan menjadi
OPTIONS="--selinux-enabled -g /mnt"
Setelah restart ( systemctl restart docker), Docker harus menggunakan direktori baru
Pada CentOS 6.5 / 6.6 dan mungkin 7, Anda menggunakan file / etc / sysconfig / docker yang sama, tetapi Anda menambahkan argumen ke nama variabel other_args.
dlaidlaw
Opsi ini disebut DOCKER_OPTS sekarang (versi buruh pelabuhan 1.7.0).
nedim
6
Dari versi 1.8 dan seterusnya Docker, menggunakan file konfigurasi Docker di / etc / sysconfig sudah tidak digunakan lagi. Sebagai gantinya, Anda harus menggunakan file konfigurasi drop-in systemd di etc / systemd / system / docker.service.d. Setelah menambahkan atau memodifikasi file drop-in saat layanan buruh pelabuhan sedang berjalan, jalankan perintah systemctl daemon-reload untuk memberi tahu systemd untuk memuat kembali konfigurasi untuk layanan. docs.oracle.com/cd/E52668_01/E54669/html/…
Jangan gunakan tautan simbolis untuk memindahkan folder buruh pelabuhan ke / mnt (misalnya). Ini dapat menyebabkan masalah dengan perintah docker rm .
Lebih baik gunakan Opsi -g untuk buruh pelabuhan. Di Ubuntu Anda dapat mengaturnya secara permanen di /etc/default/docker.io. Tingkatkan atau ganti Baris DOCKER_OPTS.
Berikut sebuah contoh: `DOCKER_OPTS =" - g / mnt / di suatu tempat / yang lain / buruh pelabuhan / "
Ini adalah solusi luar biasa yang menyelamatkan hidup saya. :)
Niketh Sudhakaran
Saya sudah mengeksekusi di atas dan buruh pelabuhan itu berdiri dan berjalan. Tetapi saya tidak dapat menemukan gambar buruh pelabuhan saya sudah ada. Ada saran?
Thilina Viraj
13
Solusi ini berfungsi pada Red Hat 7.2 & Docker 1.12.0
Edit file
/lib/systemd/system/docker.service di editor teks Anda.
tambahkan -g / path / ke / buruh pelabuhan / di akhir direktif ExecStart . Baris lengkapnya akan terlihat seperti ini.
ExecStart=/usr/bin/dockerd -g /path/to/docker/
Jalankan perintah di bawah ini
systemctl daemon-reload
systemctl restart docker
Jalankan perintah untuk memeriksa direktori buruh pelabuhan
docker info | grep "loop file\|Dir"
Jika Anda memiliki file / etc / sysconfig / docker di Red Hat atau docker 1.7.1 periksa jawaban ini .
kasus saya: centos7, buruh pelabuhan terbaru; saya harus memanggil "systemctl status docker" untuk menemukan file "docker.service" dan menambahkan opsi "-g" seperti dalam jawaban. Terima kasih
datdinhquoc
13
Salin dan tempel versi jawaban pemenang :)
Buat file ini hanya dengan konten ini:
$ sudo vi /etc/docker/daemon.json
{
"graph": "/my-docker-images"
}
Diuji di Ubuntu 16.04.2 LTSdalam buruh pelabuhan1.12.6
Untuk Debian / Ubuntu atau Fedora, Anda mungkin dapat menggunakan jawaban lain. Tetapi jika Anda tidak memiliki file di bawah /etc/default/dockeratau /etc/sysconfig/docker, dan sistem Anda menjalankan systemd, Anda mungkin ingin mengikuti jawaban ini oleh h3nrik . Saya menggunakan Arch, dan ini berfungsi untuk saya.
Pada dasarnya, Anda perlu mengkonfigurasi systemd untuk membaca lokasi gambar buruh pelabuhan baru sebagai variabel lingkungan, dan meneruskan variabel lingkungan ke dalam skrip pelaksanaan daemon Docker.
Untuk kelengkapan, berikut adalah jawaban h3nrick:
Apakah Anda memiliki /lib/systemd/system/docker.service file?
Jika demikian, edit sehingga layanan Docker menggunakan yang biasa /etc/default/dockersebagai file lingkungan:EnvironmentFile=-/etc/default/docker .
Dalam /etc/default/dockerfile tersebut lalu tambahkan DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".
Pada akhirnya lakukan saja systemctl daemon-reload && systemctl restart docker.
Untuk informasi lebih lanjut, silakan melihat dokumentasi .
Jangan membuat softlink. Alasan melihat komentar saya yang saya kirim sebelumnya ... Anda mungkin mengalami masalah dengan perintah 'docker rm'!
suther
2
@suther: Mei? Sekarang adakah situasi yang Anda hadapi atau tidak? Mungkin agak tidak tepat untuk dokumentasi teknis, jika saya mengalami masalah maka saya ingin belajar kapan tepatnya itu terjadi, bagaimana masalah itu disebabkan dan bagaimana hasilnya.
hakre
4
Seperti yang disarankan oleh @mbarthelemy, ini dapat dilakukan melalui -g opsi ketika memulai daemon buruh pelabuhan secara langsung.
Namun, jika buruh pelabuhan sedang memulai sebagai layanan sistem, tidak disarankan untuk memodifikasi /etc/default/dockerfile. Ada pedoman untuk ini yang terletak di sini .
Pendekatan yang benar adalah membuat /etc/docker/daemon.jsonfile di sistem Linux (atau Mac) atau %programdata%\docker\config\daemon.jsondi Windows. Jika file ini tidak digunakan untuk hal lain, bidang berikut ini sudah cukup:
{
"graph": "/docker/daemon_files"
}
Ini dengan asumsi lokasi baru tempat Anda ingin memiliki data tetap ada /docker/daemon_files
$cat /etc/sysconfig/docker
## Path : System/Management
## Description : Extra cli switches for docker daemon
## Type : string
## Default : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"
Perhatikan bahwa DOCKER_OPTS pada awalnya kosong dan yang saya lakukan hanyalah menambahkan argumen untuk membuat buruh pelabuhan menggunakan direktori baru saya
Pada Fedora 26 dan mungkin banyak versi lain, Anda mungkin mengalami kesalahan setelah memindahkan lokasi folder dasar Anda seperti dijelaskan di atas. Ini terutama benar jika Anda memindahkannya ke suatu tempat di bawah / rumah. Ini karena SeLinux menendang dan mencegah wadah buruh pelabuhan menjalankan banyak programnya dari bawah lokasi ini.
Solusi singkatnya adalah menghapus opsi --enable-selinux saat Anda menambahkan parameter -g.
Pada AWS Ubuntu 16.04 Server saya meletakkan gambar Docker pada EBS terpisah, dipasang di / home / ubuntu / kaggle /, di bawah dir docker
Cuplikan skrip inisialisasi saya ini berfungsi dengan benar
# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them
# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
# Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see /programming/31620825/
# warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use
sudo sed -i ' s@#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ ' /etc/default/docker
sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/
sudo sed -i ' s@ExecStart.*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ ' /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them
Untuk pengguna Mac dalam versi 17.06.0-ce-mac19, Anda cukup memindahkan lokasi Disk Image dari antarmuka pengguna dalam opsi preferensi. Ubah saja lokasi gambar disk dan itu akan berfungsi (dengan mengklik Pindahkan disk image ) dan restart buruh pelabuhan. Dengan menggunakan pendekatan ini saya dapat menggunakan hardisk eksternal saya untuk menyimpan gambar buruh pelabuhan.
Jawaban:
Dengan versi Docker terbaru, Anda akan menetapkan nilai
data-root
parameter ke jalur kustom Anda, di/etc/docker/daemon.json
(sesuai dengan https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).Dengan versi yang lebih lama, Anda dapat mengubah direktori basis penyimpanan Docker (tempat penampung dan gambar) menggunakan
-g
opsi saat memulai daemon Docker. (periksadocker --help
). Anda dapat memiliki pengaturan ini diterapkan secara otomatis ketika Docker mulai dengan menambahkannya ke / etc / default / dockersumber
-g
opsi ini ke / etc / defaults / docker daripada memodifikasi file Upstart, lihat jawaban saya.DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
/etc/default/docker
file Anda .graph
atribut dalam daemon.json sudah ditinggalkan pada v17.05.0, menggunakandata-root
gantinya, lih stackoverflow.com/a/50217666/743507Mengikuti saran dari komentar saya menggunakan dokumentasi Docker systemd untuk meningkatkan jawaban ini. Prosedur di bawah ini tidak memerlukan reboot dan jauh lebih bersih.
Pertama-tama buat direktori dan file untuk konfigurasi khusus:
Untuk versi buruh pelabuhan sebelum 17.06-ce tempel:
Untuk buruh pelabuhan setelah 17.06-ce tempel:
Metode alternatif melalui
daemon.json
Saya baru-baru ini mencoba prosedur di atas dengan 17.09-ce pada Fedora 25 dan sepertinya tidak berhasil. Alih-alih modifikasi sederhana dalam
/etc/docker/daemon.json
melakukan trik:Meskipun demikian Anda harus memuat ulang konfigurasi dan memulai kembali Docker:
Untuk mengonfirmasi bahwa Docker telah dikonfigurasi ulang:
Dalam versi terbaru (17.03) diperlukan perintah yang berbeda:
Output akan terlihat seperti ini:
Atau:
Maka Anda dapat dengan aman menghapus penyimpanan Docker lama:
sumber
docker info
Pernyataan mungkin usang. Di Ubuntu 16.04, pemeriksaan untuk konfigurasi ulang adalahsudo docker info | grep "Docker Root Dir"
. Kalau tidak, jawaban yang baik, harus yang diterima;)Docker Root Dir: /"/mnt"
ketika Anda menjalankandocker info|grep "Docker Root Dir"
, Anda harus mengganti--data-root="/mnt"
ke--data-root=/mnt
dalam filedocker-storage.conf
Untuk versi buruh pelabuhan yang baru kita perlu menggunakan
data-root
seperti yanggraph
sudah usang di v17.05.0: dokumen yang sudah tidak digunakan lagiEdit
/etc/docker/daemon.json
(jika tidak ada, buat) dan sertakan:Kemudian restart Docker dengan:
sumber
Karena saya belum menemukan instruksi yang benar untuk melakukan ini di Fedora (EDIT: orang menunjuk komentar bahwa ini juga harus bekerja pada CentOS dan Suse) (/ etc / default / docker tidak digunakan di sana), saya menambahkan jawab di sini:
Anda harus mengedit / etc / sysconfig / docker , dan menambahkan opsi -g di variabel OPTIONS. Jika ada lebih dari satu opsi, pastikan Anda menyertakannya di "". Dalam kasus saya, file itu berisi:
jadi itu akan menjadi
Setelah restart (
systemctl restart docker
), Docker harus menggunakan direktori barusumber
Jangan gunakan tautan simbolis untuk memindahkan folder buruh pelabuhan ke / mnt (misalnya). Ini dapat menyebabkan masalah dengan perintah docker rm .
Lebih baik gunakan Opsi -g untuk buruh pelabuhan. Di Ubuntu Anda dapat mengaturnya secara permanen di /etc/default/docker.io. Tingkatkan atau ganti Baris DOCKER_OPTS.
Berikut sebuah contoh: `DOCKER_OPTS =" - g / mnt / di suatu tempat / yang lain / buruh pelabuhan / "
sumber
docker rm
ketika menggunakan symlink?Ubuntu 16.04
stackoverflow.com/a/30219552/977622 agar bisa berfungsiCara yang lebih mudah untuk melakukannya:
Hentikan layanan buruh pelabuhan
Pindahkan direktori buruh pelabuhan yang ada ke lokasi baru
Buat tautan simbolis
Mulai layanan buruh pelabuhan
sumber
sudo ln -s /path/to/new/docker/ /var/lib/docker
Solusi ini berfungsi pada Red Hat 7.2 & Docker 1.12.0
Edit file /lib/systemd/system/docker.service di editor teks Anda.
tambahkan -g / path / ke / buruh pelabuhan / di akhir direktif ExecStart . Baris lengkapnya akan terlihat seperti ini.
Jalankan perintah di bawah ini
Jalankan perintah untuk memeriksa direktori buruh pelabuhan
Jika Anda memiliki file / etc / sysconfig / docker di Red Hat atau docker 1.7.1 periksa jawaban ini .
sumber
Salin dan tempel versi jawaban pemenang :)
Buat file ini hanya dengan konten ini:
$ sudo vi /etc/docker/daemon.json
Diuji di
Ubuntu 16.04.2 LTS
dalam buruh pelabuhan1.12.6
sumber
graph
atribut dalam daemon.json sudah ditinggalkan pada v17.05.0, menggunakandata-root
gantinya, lih stackoverflow.com/a/50217666/743507Dalam CentOS 6.5
tambahkan baris berikut
kemudian simpan file dan mulai buruh pelabuhan lagi
dan akan membuat file repositori di
/data/docker
sumber
Untuk Debian / Ubuntu atau Fedora, Anda mungkin dapat menggunakan jawaban lain. Tetapi jika Anda tidak memiliki file di bawah
/etc/default/docker
atau/etc/sysconfig/docker
, dan sistem Anda menjalankan systemd, Anda mungkin ingin mengikuti jawaban ini oleh h3nrik . Saya menggunakan Arch, dan ini berfungsi untuk saya.Pada dasarnya, Anda perlu mengkonfigurasi systemd untuk membaca lokasi gambar buruh pelabuhan baru sebagai variabel lingkungan, dan meneruskan variabel lingkungan ke dalam skrip pelaksanaan daemon Docker.
Untuk kelengkapan, berikut adalah jawaban h3nrick:
Apakah Anda memiliki
/lib/systemd/system/docker.service
file?Jika demikian, edit sehingga layanan Docker menggunakan yang biasa
/etc/default/docker
sebagai file lingkungan:EnvironmentFile=-/etc/default/docker
.Dalam
/etc/default/docker
file tersebut lalu tambahkanDOCKER_OPTS="-g /home/rseixas/Programs/Docker/images"
.Pada akhirnya lakukan saja
systemctl daemon-reload && systemctl restart docker
.Untuk informasi lebih lanjut, silakan melihat dokumentasi .
sumber
Solusi yang lebih sederhana adalah membuat titik tautan lunak ke apa pun yang Anda inginkan, seperti
Ini bekerja untuk saya di server CentOS 6.5 saya.
sumber
Seperti yang disarankan oleh @mbarthelemy, ini dapat dilakukan melalui
-g
opsi ketika memulai daemon buruh pelabuhan secara langsung.Namun, jika buruh pelabuhan sedang memulai sebagai layanan sistem, tidak disarankan untuk memodifikasi
/etc/default/docker
file. Ada pedoman untuk ini yang terletak di sini .Pendekatan yang benar adalah membuat
/etc/docker/daemon.json
file di sistem Linux (atau Mac) atau%programdata%\docker\config\daemon.json
di Windows. Jika file ini tidak digunakan untuk hal lain, bidang berikut ini sudah cukup:Ini dengan asumsi lokasi baru tempat Anda ingin memiliki data tetap ada
/docker/daemon_files
sumber
Pada openSUSE Leap 42.1
Perhatikan bahwa DOCKER_OPTS pada awalnya kosong dan yang saya lakukan hanyalah menambahkan argumen untuk membuat buruh pelabuhan menggunakan direktori baru saya
sumber
Pada Fedora 26 dan mungkin banyak versi lain, Anda mungkin mengalami kesalahan setelah memindahkan lokasi folder dasar Anda seperti dijelaskan di atas. Ini terutama benar jika Anda memindahkannya ke suatu tempat di bawah / rumah. Ini karena SeLinux menendang dan mencegah wadah buruh pelabuhan menjalankan banyak programnya dari bawah lokasi ini.
Solusi singkatnya adalah menghapus opsi --enable-selinux saat Anda menambahkan parameter -g.
sumber
Pada AWS Ubuntu 16.04 Server saya meletakkan gambar Docker pada EBS terpisah, dipasang di / home / ubuntu / kaggle /, di bawah dir docker
Cuplikan skrip inisialisasi saya ini berfungsi dengan benar
sumber
Untuk pengguna Mac dalam versi 17.06.0-ce-mac19, Anda cukup memindahkan lokasi Disk Image dari antarmuka pengguna dalam opsi preferensi. Ubah saja lokasi gambar disk dan itu akan berfungsi (dengan mengklik Pindahkan disk image ) dan restart buruh pelabuhan. Dengan menggunakan pendekatan ini saya dapat menggunakan hardisk eksternal saya untuk menyimpan gambar buruh pelabuhan.
sumber