LoginSignup
5
7

【Docker】コンテナ起動時にPorts are not available: address already in useが出た時の対処法について

Last updated at Posted at 2022-06-04

前提

  • Linuxの基本的な操作は知っている
  • Dockerの基礎的な知識を持っている
  • 今回はMySQLとRailsのDockerコンテナを使用したときに起こった状況を解説しています

エラーが出る原因

docker compose upと打つと

terminal
❯ docker compose up
[+] Running 2/2
 ⠿ Container rails-db-1   Created                                                                                                                                                              0.0s
 ⠿ Container rails-web-1  Recreated                                                                                                                                                            0.2s
Attaching to rails-db-1, rails-web-1
Error response from daemon: 
- Ports are not available: 
- exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: 
- bind: address already in use

というエラー文が表示されます
要するにMySQLのポート3306を指定したら空いてないから使えないよって言われてます
そのため、今回はすでに開いているポート3306を閉じます

対処法

ターミナル上で

terminal
sudo lsof -i:3306

と打ちます
lsof(listen open files)のオプション-iでポート番号を指定することができるので
今回は-i:3306でMySQLのポート番号を指定します
すると

terminal
sudo lsof -i:3306
COMMAND PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
mysqld  150 _mysql   24u  IPv6 0x99545106b728bf5f      0t0  TCP *:mysql (LISTEN)

と表示されます
ポートを落としたいので

terminal
sudo kill <PID>

と打ちます。私の画面ではPIDが150なので 

terminal
sudo kill 150

と打ちますがPIDは人によって違うと思います

terminal
sudo lsof -i:3306

と打っても何も表示されないことを確認してもう一度コンテナを起動します

terminal
docker compose up
[+] Running 1/0
 ⠿ Container rails-db-1  Created                                                                                                                                                               0.0s
Attaching to rails-db-1, rails-web-1
rails-db-1   | 2022-06-04 04:27:17+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
rails-db-1   | 2022-06-04 04:27:18+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
rails-db-1   | 2022-06-04 04:27:18+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
rails-web-1  | ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
rails-db-1   | 2022-06-04T04:27:18.803556Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.22) starting as process 1
rails-db-1   | 2022-06-04T04:27:18.824864Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
rails-db-1   | 2022-06-04T04:27:19.119291Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
rails-db-1   | 2022-06-04T04:27:19.356866Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
・・・
略
・・・
/usr/sbin/mysqld: ready for connections. Version: '8.0.22'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.
rails-web-1  | => Booting Puma
rails-web-1  | => Rails 6.1.3.2 application starting in development 
rails-web-1  | => Run `bin/rails server --help` for more startup options
rails-web-1  | Puma starting in single mode...
・・・
略
・・・
rails-web-1  | Use Ctrl-C to stop

無事コンテナの起動に成功しました!!

まとめ

初めてこのエラーに遭遇した時はなんじゃこれ?って焦っていた記憶がありますが上記の記事通りにやれば解決できるかと思います。ポート番号を変更しても解決できますが極力変えない方がいいと思います

記事の紹介

以下の記事も書いたので良かったら読んでいただけると幸いです

参考文献

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7